Logischerweise werden die Verknüpfungen in der Reihenfolge der ON
Klauseln von links nach rechts aufgelöst.
Die Ausgabe jedes Joins ist eine virtuelle Tabelle, die in den nächsten Join eingeht.
Für die Abfrage in Ihrer Frage wird dann das Ergebnis der virtuellen Tabelle von A LJ B
direkt mit verbunden C
. Die Verknüpfungsbedingung von B.Col3 = C.Col4
verliert alle erweiterten Nullzeilen, die durch die ursprüngliche linke Verknüpfung erhalten wurden, und verwandelt die erste Verknüpfung effektiv wieder in eine innere Verknüpfung. Die resultierende virtuelle Tabelle (von der alle Zeilen erhalten bleiben C
) wird dann mit der inneren Verknüpfung verknüpft D
.
So kann Ihre anfängliche Abfrage als vereinfacht werden
SELECT *
FROM TBLA A
INNER JOIN TBLB B ON A.Col1 = B.Col2
RIGHT JOIN TBLC C ON B.Col3 = C.Col4
JOIN TBLD D ON C.Col5 = D.Col6
Welches ist effektiv das gleiche wie (A IJ B) ROJ (C IJ D)
Die Reihenfolge der ON
Klauseln entspricht nicht unbedingt der Reihenfolge, in der die Tabellen in der Abfrage angezeigt werden. Dies könnte auch umgeschrieben werden als(C IJ D) LOJ (A IJ B)
SELECT *
FROM TBLC C
INNER JOIN TBLD D
ON C.Col5 = D.Col6
LEFT JOIN TBLA A
INNER JOIN TBLB B
ON A.Col1 = B.Col2
ON B.Col3 = C.Col4
Die Position der on-Klauseln bedeutet, dass der äußere Join zwischen den beiden virtuellen Tabellen ausgeführt wird, die aus (C IJ D)
und (A IJ B)
nicht nur aus einer einzelnen Tabelle resultieren .
In Ihrer zweiten konzeptionellen Abfrage wird die virtuelle Tabelle konzeptionell A x C
mit B verknüpft, wobei das gesamte kartesische Produkt erhalten bleibt. Das Ergebnis wird dann D
mit dem Prädikat verknüpft C.Col5 = D.Col6
. Dies eliminiert alle Zeilen aus dem Endergebnis, die keine innere Verbindung zwischen C
und D
bedeuten, dass es äquivalent zu ist
SELECT *
FROM TBLC C
JOIN TBLD D
ON C.Col5 = D.Col6
CROSS JOIN TBLA A
LEFT JOIN TBLB B
ON A.Col1 = B.Col2
AND B.Col3 = C.Col4