ไม่มีสิ่งใด (ที่ฉันรู้) ที่สามารถทำได้ด้วยการเข้าร่วมที่ถูกต้องที่ไม่สามารถทำได้ด้วยการเข้าร่วมทางซ้าย แต่บางครั้งไวยากรณ์ที่มีการรวมซ้ายนั้นน่าเกลียด สมมติว่าคุณมีตารางต่อไปนี้:
Persons
ID | Name
Orders
ID | CustomerId | other unimportant stuff
SpecialOrderDetails
ID | OrderId | other stuff
สมมติว่าคุณต้องการรับรายชื่อของคนทั้งหมดในฐานข้อมูลของคุณและคำสั่งซื้อใด ๆ ที่พวกเขามีรายละเอียดการสั่งซื้อพิเศษ (เราจะบอกว่าคำสั่งซื้อทั้งหมดไม่ได้มีรายละเอียดคำสั่งพิเศษ) โดยปกติแล้วคุณจะเข้าร่วมการสั่งซื้อด้านซ้ายจากคน แต่คุณต้องเข้าร่วมในรายละเอียดการสั่งซื้อพิเศษ หากคุณใช้การรวมภายในที่นั่นจะทำให้การเข้าร่วมด้านซ้ายจากบุคคลเพื่อการสั่งซื้อเป็นการรวมภายในอย่างมีประสิทธิภาพ IE: นี่คือสิ่งที่คุณต้องการจะทำ แต่ไม่ได้ผล (มันจะไม่รวมใครก็ตามที่ไม่มีคำสั่งพิเศษ):
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
ดังนั้นคุณสามารถเขียนซ้ำได้ดังนี้:
--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
ไม่ชัดเจนอย่างแน่นอน (สมมติว่าไม่มีความคิดเห็น) แต่ทำงานได้ หากนี่คือสิ่งที่มากกว่าหนึ่งครั้ง (เช่นบางสิ่งบางอย่างที่ใครบางคนกำลังจะต้องกลับมาและรักษาบางวัน) การใช้การเข้าร่วมที่ถูกต้องอาจทำให้ชัดเจนว่าเจตนาคืออะไร
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
ซึ่งค่อนข้างสั้นและชัดเจนมากขึ้น (แต่ถ้าใครก็ตามที่อ่านมันจะเข้าใจถูกต้อง) โปรดทราบว่าสิ่งนี้สามารถเขียนด้วยการรวมซ้าย แต่ต้องมีการเข้าร่วมที่ซ้อนกัน (ซึ่งบางคนอาจคุ้นเคยกับการรวมขวามากกว่า)
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
ณ จุดนี้มันเป็นตัวเลือกของสิ่งที่ชัดเจนที่สุดและสิ่งที่คนส่วนใหญ่จะเข้าใจ (คุณจะรู้วิธีการ Google ไวยากรณ์นั้นถ้าคุณไม่ทราบว่ามันถูกเรียกว่าการเข้าร่วมซ้อนกัน?)
กล่าวโดยสรุปคุณไม่ต้องการการรวมที่ถูกต้องแต่อาจทำให้อ่านง่ายขึ้น