LEFT JOIN mit Bedingungen: Wo ist der Unterschied zwischen ON und WHERE?
In SQL Server kombiniert LEFT JOIN Zeilen aus zwei Tabellen basierend auf eine angegebene Join-Bedingung. Während die ON-Klausel die Join-Bedingung innerhalb der LEFT JOIN-Anweisung definiert, filtert die WHERE-Klausel Zeilen nach der Join-Operation. Diese subtile Unterscheidung kann zu unerwarteten Ergebnissen führen, wenn sie nicht richtig verstanden wird.
Bedenken Sie die folgende Abfrage:
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 AND t2.f3 > something
Überraschenderweise liefert diese Abfrage nicht die gleichen Ergebnisse wie die folgende:
SELECT t1.f2 FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1 AND cond2 WHERE t2.f3 > something
Die Erklärung
Die ON-Klausel spielt eine entscheidende Rolle bei der Bestimmung, welche Zeilen nehmen am Join teil. Die in ON angegebene Bedingung muss wahr sein, damit Zeilen abgeglichen und in das Join-Ergebnis einbezogen werden. Im Gegensatz dazu filtert die WHERE-Klausel Zeilen, die bereits verbunden wurden.
In der ersten Abfrage ist die Bedingung t2.f3 > etwas ist Teil der ON-Klausel. Folglich werden nur Zeilen in den Join einbezogen, in denen t2.f3 größer als irgendetwas ist. Das bedeutet, dass alle übereinstimmenden Zeilen, in denen t2.f3 nicht größer als etwas ist, vom Ergebnis ausgeschlossen werden.
In der zweiten Abfrage wird die Bedingung t2.f3 > etwas ist Teil der WHERE-Klausel. Diese Klausel wird ausgewertet, nachdem der Join durchgeführt wurde. Daher sind alle Zeilen, die die ON-Klauselbedingung (t1.f1 = t2.f1 und cond2) erfüllen, Teil des Join-Ergebnisses. Die WHERE-Klausel filtert dann diese Zeilen und behält nur diejenigen bei, in denen t2.f3 größer als etwas ist.
Beispiel
Um dieses Konzept zu veranschaulichen, betrachten Sie eine Kandidatentabelle ( Kandidaten) und eine Abstimmungstabelle (Stimmen). Wenn wir Kandidaten finden möchten, die Stimmen erhalten haben, können wir einen LEFT JOIN verwenden:
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for
Diese Abfrage gibt alle Kandidaten zurück, auch diejenigen, die keine Stimmen erhalten haben. Wenn wir die Bedingung in die WHERE-Klausel verschieben:
SELECT * FROM candidates c LEFT JOIN votes v ON c.name = v.voted_for WHERE v.voted_for IS NOT NULL
Die Ergebnisse umfassen jetzt nur Kandidaten, die mindestens eine Stimme erhalten haben.
Fazit
Das Verständnis des Unterschieds zwischen ON- und WHERE-Klauseln in einem LEFT JOIN ist für die effektive Bearbeitung von Daten von entscheidender Bedeutung. Durch die sorgfältige Platzierung von Bedingungen in den entsprechenden Klauseln können Sie sicherstellen, dass Ihre Abfragen die gewünschten Ergebnisse liefern.
Das obige ist der detaillierte Inhalt vonLEFT JOIN in SQL: Was ist der Hauptunterschied zwischen den Klauseln „ON' und „WHERE'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!