ts.IdMagazynu =1 or ts.IdMagazynu is null
to jedyn warunek.
OK - działa poprawnie, ale tylko jeśli istnieje 1 magazyn.
Więc:
Dla przykładu mam 2 magazyny, 1 towar posiadający 7 wariantów.
Na magazyn 1 przyjmowany jest towar(dla dwóch wariantów towaru): pojawiają siew wpisy do tabel TowaryPartie i TowaryPartieStany.
W tym momencie wykonuję powyższe zapytanie
SELECT *
FROM dbo.TowaryWariantyKody
LEFT JOIN ( SELECT tps.IdMagazynu ,
SUM(tps.StanPartii) AS StanPartii ,
tp.IdWariantu
FROM dbo.TowaryPartieStany AS tps
LEFT JOIN dbo.TowaryPartie AS tp ON tp.IdPartii = tps.IdPartii
GROUP BY tp.IdWariantu ,
tps.IdMagazynu
) AS ts ON ts.IdWariantu = TowaryWariantyKody.IdWariantu
WHERE
(ts.IdMagazynu =1 or ts.IdMagazynu is NULL)
Wynik Ok - lista wszystkich 7 wariantów wraz z ich stanem magazynowym - StanPartii.
Teraz zapytanie dla magazynu 2
SELECT *
FROM dbo.TowaryWariantyKody
LEFT JOIN ( SELECT tps.IdMagazynu ,
SUM(tps.StanPartii) AS StanPartii ,
tp.IdWariantu
FROM dbo.TowaryPartieStany AS tps
LEFT JOIN dbo.TowaryPartie AS tp ON tp.IdPartii = tps.IdPartii
GROUP BY tp.IdWariantu ,
tps.IdMagazynu
) AS ts ON ts.IdWariantu = TowaryWariantyKody.IdWariantu
WHERE
(ts.IdMagazynu =2 or ts.IdMagazynu is NULL)
Wynik zły - nie pokazuje wszytkich wariantów - są tylko te warianty towaru, dla których nie było przyjęcia na magazyn1 (zasługa ts.IdMagazynu is NULL). W wyniku pominięte są 2 warianty dla których było przyjęcie towaru na magazyn 1.
Bez dodania warunku or ts.IdMagazynu is NULL - w ogóle nie zwraca żadnych wierszy.
Tak jak już pisałem zależy mi, aby bez względu na to czy istnieją wiersze w tabeli TowarPartieStany - zawsze była zwracana lista wszystkich wariantów z ewentualnym stanem (GROUP BY tp.IdWariantu , tps.IdMagazynu) jeśli istnieje.
Jeśli WHERE tps.IdMagazynu = jest umieszczone przed GROUP BY to jest OK - ale tak jak wspomniałem muszę mieć na końcu kodu,