Untuk INNERbergabung, tidak, urutannya tidak masalah. Kueri akan mengembalikan hasil yang sama, selama Anda mengubah pilihan Anda dari SELECT *menjadi SELECT a.*, b.*, c.*.
Untuk ( LEFT, RIGHTatau FULL) OUTERbergabung, ya, urutannya penting - dan ( diperbarui ) jauh lebih rumit.
Pertama, sambungan luar tidak komutatif, jadi a LEFT JOIN btidak sama denganb LEFT JOIN a
Gabungan luar juga tidak asosiatif, jadi dalam contoh Anda yang melibatkan properti (komutatif dan asosiatif):
a LEFT JOIN b
ON b.ab_id = a.ab_id
LEFT JOIN c
ON c.ac_id = a.ac_id
setara dengan :
a LEFT JOIN c
ON c.ac_id = a.ac_id
LEFT JOIN b
ON b.ab_id = a.ab_id
tapi:
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
tidak setara dengan :
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
Contoh asosiatif lain (semoga lebih sederhana). Pikirkan ini sebagai (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
Ini setara dengan 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
hanya karena kami memiliki ONkondisi "baik" . Keduanya ON b.ab_id = a.ab_iddan keduanya c.bc_id = b.bc_idadalah pemeriksaan kesetaraan dan tidak melibatkan NULLperbandingan.
Anda bahkan dapat memiliki kondisi dengan operator lain atau yang lebih kompleks seperti: ON a.x <= b.xatau ON a.x = 7atau ON a.x LIKE b.xdan ON (a.x, a.y) = (b.x, b.y)dan dua kueri masih akan setara.
Namun, jika salah satu dari ini terlibat IS NULLatau fungsi yang terkait dengan nol seperti COALESCE(), misalnya jika kondisinya b.ab_id IS NULL, maka dua kueri tidak akan setara.
<blahblah>? apakah Anda bergabung dengan A ke B dan A ke C, atau Anda bergabung dengan A ke B dan B ke C?