Bei INNERJoins 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, RIGHToder FULL) OUTERJoins ist die Reihenfolge wichtig - und ( aktualisierte ) Dinge sind viel komplizierter.
Erstens sind äußere Verknüpfungen nicht kommutativ, also a LEFT JOIN bnicht 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" ONBedingungen haben. Beide ON b.ab_id = a.ab_idund c.bc_id = b.bc_idsind Gleichstellungsprüfungen und beinhalten keine NULLVergleiche.
Sie können sogar Bedingungen mit anderen oder komplexeren Operatoren wie: ON a.x <= b.xoder ON a.x = 7oder ON a.x LIKE b.xoder haben, ON (a.x, a.y) = (b.x, b.y)und die beiden Abfragen wären immer noch gleichwertig.
Wenn jedoch eine dieser IS NULLFunktionen 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?