W przypadku INNERdołączeń nie, kolejność nie ma znaczenia. Zapytania zwrócą te same wyniki, o ile zmienisz wybrane opcje z SELECT *na SELECT a.*, b.*, c.*.
Dla ( LEFT, RIGHTlub FULL) OUTERsprzężeń, tak, sprawy zamówienie - i ( zaktualizowane ) rzeczy są o wiele bardziej skomplikowane.
Po pierwsze, połączenia zewnętrzne nie są przemienne, więc a LEFT JOIN bnie są takie same jakb LEFT JOIN a
Sprzężenia zewnętrzne również nie są asocjacyjne, więc w twoich przykładach, które dotyczą obu właściwości (przemienności i asocjatywności):
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
odpowiada :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
ale:
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
nie jest równoważne z :
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
Kolejny (miejmy nadzieję prostszy) przykład asocjatywności. Pomyśl o tym jako (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
Jest to równoważne z 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
tylko dlatego, że mamy „miłe” ONwarunki. Zarówno ON b.ab_id = a.ab_idi c.bc_id = b.bc_idsą kontrole równości i nie wiążą się NULLporównań.
Można nawet mieć warunki z innymi operatorami lub bardziej skomplikowanych, takich jak: ON a.x <= b.xlub ON a.x = 7lub ON a.x LIKE b.xlub ON (a.x, a.y) = (b.x, b.y)i dwa zapytania nadal byłyby równoważne.
Jeśli jednak którykolwiek z nich dotyczy IS NULLlub funkcja jest powiązana z zerami COALESCE(), na przykład jeśli warunek był spełniony b.ab_id IS NULL, wówczas dwa zapytania nie byłyby równoważne.
<blahblah>? czy dołączasz do A do B i od A do C, czy dołączasz do A do B i B do C?