W przypadku INNER
dołą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
, RIGHT
lub FULL
) OUTER
sprzęż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 b
nie 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” ON
warunki. Zarówno ON b.ab_id = a.ab_id
i c.bc_id = b.bc_id
są kontrole równości i nie wiążą się NULL
porównań.
Można nawet mieć warunki z innymi operatorami lub bardziej skomplikowanych, takich jak: ON a.x <= b.x
lub ON a.x = 7
lub ON a.x LIKE b.x
lub 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 NULL
lub 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?