Bei INNER
Joins spielt die Reihenfolge keine Rolle. Die Abfragen geben dieselben Ergebnisse zurück, solange Sie Ihre Auswahl von SELECT *
in ändern SELECT a.*, b.*, c.*
.
Für ( LEFT
, RIGHT
oder FULL
) OUTER
Joins ist die Reihenfolge wichtig - und ( aktualisierte ) Dinge sind viel komplizierter.
Erstens sind äußere Verknüpfungen nicht kommutativ, also a LEFT JOIN b
nicht dasselbe wieb LEFT JOIN a
Äußere Verknüpfungen sind ebenfalls nicht assoziativ. In Ihren Beispielen, die beide Eigenschaften (Kommutativität und Assoziativität) beinhalten:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
ist äquivalent zu :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
aber:
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
AND c.bc_id = b.bc_id
ist nicht gleichbedeutend mit :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
AND b.bc_id = c.bc_id
Ein weiteres (hoffentlich einfacheres) Assoziativitätsbeispiel. Stellen Sie sich das vor als (a LEFT JOIN b) LEFT JOIN c
:
a LEFT JOIN b
ON b.ab_id = a.ab_id -- AB condition
LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
Dies ist gleichbedeutend zu a LEFT JOIN (b LEFT JOIN c)
:
a LEFT JOIN
b LEFT JOIN c
ON c.bc_id = b.bc_id -- BC condition
ON b.ab_id = a.ab_id -- AB condition
nur weil wir "schöne" ON
Bedingungen haben. Beide ON b.ab_id = a.ab_id
und c.bc_id = b.bc_id
sind Gleichstellungsprüfungen und beinhalten keine NULL
Vergleiche.
Sie können sogar Bedingungen mit anderen oder komplexeren Operatoren wie: ON a.x <= b.x
oder ON a.x = 7
oder ON a.x LIKE b.x
oder haben, ON (a.x, a.y) = (b.x, b.y)
und die beiden Abfragen wären immer noch gleichwertig.
Wenn jedoch eine dieser IS NULL
Funktionen oder eine Funktion, die sich auf Nullen bezieht, wie COALESCE()
z. B. wenn die Bedingung erfüllt ist b.ab_id IS NULL
, sind die beiden Abfragen nicht gleichwertig.
<blahblah>
? Verbinden Sie A mit B und A mit C oder verbinden Sie A mit B und B mit C?