Tidak ada (yang saya tahu) yang bisa dilakukan dengan hak bergabung yang tidak bisa dilakukan dengan bergabung kiri. Tapi kadang-kadang sintaks dengan gabungan kiri lebih buruk. Katakanlah Anda memiliki tabel berikut:
Persons
ID | Name
Orders
ID | CustomerId | other unimportant stuff
SpecialOrderDetails
ID | OrderId | other stuff
Katakanlah Anda perlu mendapatkan daftar semua orang di database Anda dan pesanan apa pun yang mereka miliki dengan detail pesanan khusus (kami akan mengatakan bahwa tidak semua pesanan memiliki detail pesanan khusus). Jadi, Anda biasanya akan melakukan join kiri dari orang ke pesanan. Tetapi kemudian Anda harus bergabung dalam detail pesanan khusus. Jika Anda menggunakan inner join di sana, itu akan secara efektif membuat join kiri dari orang ke pesanan menjadi join internal. IE: ini yang ingin Anda lakukan tetapi tidak berhasil (ini akan mengecualikan siapa pun yang tidak memiliki pesanan khusus):
select p.*, o.*, d.*
from Persons p
left join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id
Jadi Anda dapat menulis ulang sebagai ini:
--get all the people without a special order
select p.*, NULL, NULL, ... --NULLs placeholders for all the fields from OrderDetails and SpecialOrderDetails
from Persons p
left join Orders o on o.CustomerId = p.Id
left join SpecialOrderDetails d on d.OrderId = o.Id
where o.Id is null
union
--get all the people with a special order
select p.*, o.*, d.*
from Persons p
inner join Orders o on o.CustomerId = p.Id
inner join SpecialOrderDetails d on d.OrderId = o.Id
Tidak begitu jelas (dengan asumsi tidak ada komentar), tetapi itu berhasil. Jika ini adalah sesuatu yang lebih dari satu kali (mis. Sesuatu yang seseorang harus kembali dan pertahankan suatu hari nanti) menggunakan hak bergabung mungkin memperjelas apa maksudnya.
select p.*, o.*, d.*
from Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
right join Persons p on p.Id = o.CustomerId
Yang sedikit lebih ringkas dan jelas (tetapi hanya jika siapa pun yang membacanya mengerti benar bergabung). Perhatikan bahwa ini dapat ditulis dengan gabungan kiri, tetapi membutuhkan gabungan bersarang (yang mungkin kurang dikenal orang daripada gabungan kanan).
select p.*, o.*, d.*
from Persons p
left join Orders o
inner join SpecialOrderDetails d on d.OrderId = o.Id
on o.CustomerId = p.Id
Pada titik ini, ini adalah pilihan apa yang paling jelas dan apa yang kebanyakan orang akan mengerti (akankah Anda tahu bagaimana cara menggunakan sintaks google itu jika Anda tidak tahu itu disebut nested join?).
Singkatnya, Anda tidak benar-benar membutuhkan gabungan yang benar, tetapi mereka mungkin membuatnya lebih mudah dibaca.