2012-06-22 9 views
7

Ich bin beschäftigt, eine Abfrage mit der alten Stil-Syntax in die neue Join-Syntax zu konvertieren. Das Wesen meiner Abfrage lautet wie folgt:SQL Inner Join. ON-Bedingung vs WHERE-Klausel

Original-Abfrage

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 

Neue Abfrage

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 

In diesem Beispiel "Original Query" gibt 46 Zeilen, wobei "New Query" gibt über 800

Kann mir jemand den Unterschied erklären? Ich hätte angenommen, dass diese Abfragen identisch sind.

Antwort

17

Das Problem ist mit Ihrem Beitritt zu InterestRunDetail. Sie treten auf IntRunCode zweimal.

Das muss die richtige Abfrage sein:

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

Danke Kevin, ich fühle mich wie ein Idiot, dass ich das nicht bemerkt habe !! – Russell

+2

Es passiert uns allen. :-) –

4

Die "neue Abfrage" ist derjenige, kompatibel mit dem aktuellen Standard ANSI SQL für Joins.

Auch finde ich Abfrage # 2 viele Reiniger:

  • Sie sind fast zu denken gezwungen, und geben Sie die Join-Bedingung (en) zwischen zwei Tabellen - Sie werden nicht zufällig haben kartesisch Produkte in Ihrer Abfrage. Wenn Sie zehn Tabellen, aber nur sechs Join-Bedingungen in Ihrer WHERE-Klausel auflisten - Sie erhalten viel mehr Daten zurück als erwartet!

  • Ihre WHERE Klausel nicht vollgestopft mit Bedingungen verbinden und somit ist es sauberer, weniger chaotisch, einfacher zu lesen und verstehen

  • die Typ Ihrer JOIN (ob INNER JOIN, LEFT OUTER JOIN, CROSS JOIN) typischerweise viel einfacher zu sehen - seit du es buchstabierst. Mit dem „alten Stil“ Syntax, die Differenz zwischen den Join-Typen ist ziemlich schwer zu sehen, begraben irgendwo in Ihrem viele WHERE Kriterien .....

Funktionell sind die beiden identisch - # 1 möglicherweise früher oder später von einigen Abfrage-Engines veraltet.

Auch Aaron Bertrandsche ausgezeichnete Bad Habits to Kick - using old-style JOIN syntax Blog-Post für weitere Informationen sehen - und während Sie gerade dabei sind - lesen all „schlechte Gewohnheiten treten“ Beiträge - alle sehr viel wert!

+1

Gute Antwort - aber seine Fragen sind eigentlich nicht identisch - es sieht so aus als wäre es nur ein Tippfehler ;-) –