SQL-Join: where-Klausel vs. on-Klausel

Nach dem Lesen ist dies kein Duplikat von Explizite vs. Implizite SQL-Joins. Die Antwort kann verwandt sein (oder sogar die gleiche), aber die Frage ist anders.


Worin besteht der Unterschied und was gehört jeweils dazu?

Wenn ich die Theorie richtig verstehe, sollte der Abfrageoptimierer in der Lage sein, beide austauschbar zu verwenden.

Lösung

Das ist nicht dasselbe.

Betrachten Sie diese Abfragen:

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345

und

SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID 
    AND Orders.ID = 12345

Die erste gibt einen Auftrag und seine Zeilen, falls vorhanden, für die Auftragsnummer "12345" zurück. Die zweite gibt alle Bestellungen zurück, aber nur die Bestellung 12345 wird mit Zeilen versehen.

Mit einem "INNER JOIN" sind die Klauseln effektiv gleichwertig. Nur weil sie funktionell gleich sind, d. h. die gleichen Ergebnisse liefern, bedeutet dies jedoch nicht, dass die beiden Klauseln die gleiche semantische Bedeutung haben.

Kommentare (10)

Bei INNER JOIN sind sie austauschbar, und der Optimierer ordnet sie nach Belieben neu an.

Bei "OUTER JOIN" sind sie nicht unbedingt austauschbar, je nachdem, von welcher Seite der Verknüpfung sie abhängen.

Ich setze sie an die eine oder andere Stelle, je nach Lesbarkeit.

Kommentare (2)

Bei einer inneren Verknüpfung bedeuten sie das Gleiche. Bei einer äußeren Verknüpfung erhalten Sie jedoch unterschiedliche Ergebnisse, je nachdem, ob Sie die Verknüpfungsbedingung in die WHERE-Klausel oder die ON-Klausel setzen. Werfen Sie einen Blick auf diese verwandte Frage und diese Antwort (von mir).

Meiner Meinung nach ist es am sinnvollsten, die Join-Bedingung immer in die ON-Klausel zu setzen (es sei denn, es handelt sich um einen Outer-Join und Sie wollen sie tatsächlich in der Where-Klausel haben), da so für jeden, der Ihre Abfrage liest, klarer wird, unter welchen Bedingungen die Tabellen gejoint werden, und außerdem wird so verhindert, dass die WHERE-Klausel Dutzende von Zeilen lang ist.

Kommentare (0)