Untuk INNER
bergabung, tidak, urutannya tidak masalah. Kueri akan mengembalikan hasil yang sama, selama Anda mengubah pilihan Anda dari SELECT *
menjadi SELECT a.*, b.*, c.*
.
Untuk ( LEFT
, RIGHT
atau FULL
) OUTER
bergabung, ya, urutannya penting - dan ( diperbarui ) jauh lebih rumit.
Pertama, sambungan luar tidak komutatif, jadi a LEFT JOIN b
tidak 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 ON
kondisi "baik" . Keduanya ON b.ab_id = a.ab_id
dan keduanya c.bc_id = b.bc_id
adalah pemeriksaan kesetaraan dan tidak melibatkan NULL
perbandingan.
Anda bahkan dapat memiliki kondisi dengan operator lain atau yang lebih kompleks seperti: ON a.x <= b.x
atau ON a.x = 7
atau ON a.x LIKE b.x
dan ON (a.x, a.y) = (b.x, b.y)
dan dua kueri masih akan setara.
Namun, jika salah satu dari ini terlibat IS NULL
atau 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?