MS SQL - modyfikacja zapytania

0

Witam.
Potrzebuję pomocy przy zmianie zapytania SQL

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

                            WHERE tps.IdMagazynu =1 -- przenieść do WHERE na końcu kodu

                    GROUP BY tp.IdWariantu ,
                            tps.IdMagazynu
                  ) AS ts ON ts.IdWariantu = TowaryWariantyKody.IdWariantu

WHERE ... -- przenieść tutaj

Nie mogę poradzić sobie ze przebudowaniem zapytania w taki sposób, aby warunek WHERE tps.IdMagazynu =1 znajdował się na końcu kodu - jest to konieczne. Oczywiście w obecnej postaci przeniesienie warunku zwraca już inny wynik. Poradźcie coś proszę.

0

Zwraca inny wynik i będzie zwracać inny wynik bo jest LEFT JOIN. Nie przeskoczysz tego.

0

Dlaczego jest to konieczne?

0
Marcin.Miga napisał(a):

Zwraca inny wynik i będzie zwracać inny wynik bo jest LEFT JOIN. Nie przeskoczysz tego.

A tam:

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
0
Panczo napisał(a):
Marcin.Miga napisał(a):

Zwraca inny wynik i będzie zwracać inny wynik bo jest LEFT JOIN. Nie przeskoczysz tego.

A tam:

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

W ten sposób już kombinowałem, ale taka modyfikacja zwraca inny wynik zapytania.
Warunek musi być na końcu, ponieważ stanowi CriteriaOperator dla obiektu XPServerCollectionSource (DevExpress), a pozostała część kodu SQL będzie tworzyła View w MSSQL.

0

W ten sposób już kombinowałem, ale taka modyfikacja zwraca inny wynik zapytania.

Podaj przykład różnicy, bo nie powinno się różnić

0
Panczo napisał(a):

W ten sposób już kombinowałem, ale taka modyfikacja zwraca inny wynik zapytania.

Podaj przykład różnicy, bo nie powinno się różnić

Spekulacja:
a) TowaryPartieStany - jakaś partia towaru nie jest umieszczona w magazynie -> idMagazynu IS NULL
b) Ten "górny" left join wyciągnie jakieś ekstra stany warianty kodu, dla którego idMagazynu IS NULL
c) możemy dostać coś więcej przez warunek idMagazynu IS NULL

Nie wiem jednak czy partia może być niezmagazynowana :)

0

@yarel w sumie racja, ale w takim razie zapytanie musiałoby brać tylko pozycje z wypełnionym magazynem, poza tym left join pomiedzy dbo.TowaryPartieStany a dbo.TowaryPartie powinien być zmieniony na inner join bo nie potrzebujemy czegoś bez idwariantu, tak wynika z tego joina: ts.IdWariantu = TowaryWariantyKody.IdWariantu

0

W wyniku zapytania zamierzam uzyskać:

  • zawsze wyświetlić wszystkie warianty towaru - Tabela TowaryWariantyKody. Ma to być pełna lista wariantów bez względu na to czy w tabeli TowaryPartieStany znajdują się wiersze dla danego wariantu.
  • dla tych wariantów zsumować stan dla każdego wariantu i magazynu: GROUP BY tp.IdWariantu , tps.IdMagazynu - Tabela TowaryPartieStany. Tabela TowaryPartie jest tylko po to, aby uzyskać IdWariantu partii (w tabeli TowaryPartieStany nie ma kolumny IdWariantu).
  • no i wybór magazyny ma być w ostatnim warunku Where na końcu kodu.
    @Panczo zmiana na inner join nie ma znaczenia, ponieważ jeśli istnieje partia to zawsze jest też stan. Dodam, że w tabeli TowaryWariantyKody może istnieć wiersz bez powiązanych wierszy w tabelach TowaryPartie i TowaryPartieStany - po prostu towar posiada warianty, a partie i stany pojawiają się dopiero przy przyjęciu towaru na magazyn.
0

No to czy w tabeli dbo.TowaryPartieStany rekordy gdzie IdMagazynu jest puste/null?

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