2012-06-22 7 views
7

Jestem zajęty konwersją zapytania przy użyciu składni starego stylu do nowej składni sprzężenia. Istotą mojego zapytania jest następująca:SQL Inner Join. Warunek ON vs WHERE klauzula

Original Query

SELECT i.* 
FROM 
    InterestRunDailySum i, 
    InterestRunDetail ird, 
    InterestPayments p 
WHERE 
    p.IntrPayCode = 187 
    AND i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode 
    AND ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode 

New Query

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.IntRunCode = p.IntRunCode) 
    WHERE 
    p.IntrPayCode = 187 

W tym przykładzie, "Original Query" zwraca 46 wierszy, gdzie "New Query" zwraca ponad 800

Czy ktoś może mi wyjaśnić różnicę? Założę się, że te zapytania są identyczne.

Odpowiedz

17

Problem dotyczy połączenia z InterestRunDetail. Dołączasz dwukrotnie do IntRunCode.

Prawidłowe zapytanie powinno być:

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode) 
    WHERE 
    p.IntrPayCode = 187 
+1

Dziękuję Kevin, czuję się jak głupiec, że tego nie zauważam !! – Russell

+2

Zdarza się nam wszystkim. :-) –

4

„Nowe zapytanie” jest jedną zgodną z aktualnym standardem ANSI SQL dla przyłącza.

Również uważam zapytania nr 2 dużo czystsze:

  • jesteś prawie zmuszony zastanowić się i określić dołączyć warunek (y) między dwiema tabelami - nie przypadkowo mają kartezjański produkty w zapytaniu. Jeśli zdarzy ci się wymienić dziesięć tabel, ale tylko sześć warunków łączenia w klauzuli WHERE - dostaniesz o wiele więcej danych niż oczekiwano!

  • Twój klauzula WHERE nie jest zaśmiecone dołączyć warunki, a zatem jest to czystsze, mniej brudny, łatwiejsze do odczytania i zrozumienia

  • typ z Twojego JOIN (czy INNER JOIN, LEFT OUTER JOIN, CROSS JOIN) jest zazwyczaj o wiele łatwiej zobaczyć - od kiedy to przeliterujesz. Ze składnią „starym stylu”, różnica między tymi dołączyć rodzajów jest raczej trudno zobaczyć, pochowany gdzieś w swoich partii WHERE kryteriami .....

Funkcjonalnie, dwie są identyczne - # 1 mogą być przestarzałe prędzej czy później przez niektóre silniki zapytań.

zobaczyć także Aaron Bertrand za doskonałą Bad Habits to Kick - using old-style JOIN syntax blogu więcej informacji - i podczas gdy jesteś na to - czytaj wszystkie „złe nawyki do kopa” wiadomości - wszystkie bardzo warto!

+1

Dobra odpowiedź - ale jego zapytania nie są identyczne - wygląda na to, że był to tylko literówka ;-) –