Jak znaleźć faktury z dwoma konkretnymi towarami

0

Mam napisać zapytane które zwróci mi faktury które zawierają dwa konkretne towary (na jednej fakturze muszą być oba te towary, a nie tylko jeden z nich).

Na razie zrobiłem takie coś:

SELECT * FROM Faktury
WHERE id_fak IN
(
	SELECT id_fak FROM FakturySZ fsz
		WHERE EXISTS (SELECT * FROM FakturySZ WHERE id_towar = 1 AND id_fak = fsz.id_fak)
		AND   EXISTS (SELECT * FROM FakturySZ WHERE id_towar = 2 AND id_fak = fsz.id_fak)
)
 

Ale jak będę chciał wyszukać faktury które mają 3 (lub jeszcze więcej) konkretne towary to mam dodawać kolejne bloki EXISTS?
Może jest jakiś prostszy i bardzie elegancki sposób?

2

join FakturySZ i where id_towar IN (....)

0
somekind napisał(a):

join FakturySZ i where id_towar IN (....)

Nie, bo znajduje mi też faktury, które zawierają tylko jeden z wymaganych towarów. A muszą być oba na jednej fakturze.

1

a takie cos:

SELECT * FROM Faktury where 
(select count(distinct id_towar) FROM FakturySZ WHERE id_fak = fsz.id_fak and  id_towar in (1,2,3,4,5))=5

edit:
albo:

SELECT f.id_fak FROM Faktury f inner join FakturySZ s on f.id_fak=s.id_fak 
where s.id_towar in (1,2,3,4,5)
group by f.id_Fak
having count(distinct s.id_towar)=5
0

select *
from
faktury f
join (select pozycje.id_faktury from pozycje where pozycje.id_towaru in(...) group by pozycje.id_faktury having count(*) > 2) p
on p.id_faktury = f.id_faktury

0
katelx napisał(a):

a takie cos:

SELECT * FROM Faktury where 
(select count(distinct id_towar) FROM FakturySZ WHERE id_fak = fsz.id_fak and  id_towar in (1,2,3,4,5))=5

edit:
albo:

SELECT f.id_fak FROM Faktury f inner join FakturySZ s on f.id_fak=s.id_fak 
where s.id_towar in (1,2,3,4,5)
group by f.id_Fak
having count(distinct s.id_towar)>=5

Też nie, bo mam kilka przypadków że dana pozycja na fakturze jest powtórzona i wtedy Count = 2, nawet jeśli nie ma tej drugiej pozycji.

Ale rozwiązanie zaproponowane przez huziauzia wydaje się być najlepszym.

0

poprawka.
To katelx dał dobre rozwiązanie.
A rozwiazanie huziauzia też będzie działać jeśli zamienić count(*) na COUNT(DISTINCT pozycje.id_towar)

Wielki dzięki wszystkim :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1