Không có bất cứ điều gì (mà tôi biết) có thể được thực hiện với một tham gia bên phải mà không thể được thực hiện với một tham gia bên trái. Nhưng đôi khi cú pháp với các phép nối trái là xấu hơn. Giả sử bạn có các bảng sau:
Persons
ID | Name
Orders
ID | CustomerId | other unimportant stuff
SpecialOrderDetails
ID | OrderId | other stuff
Giả sử bạn cần có một danh sách tất cả những người trong cơ sở dữ liệu của bạn và bất kỳ đơn hàng nào họ có với chi tiết đơn hàng đặc biệt (chúng tôi sẽ nói rằng không phải tất cả các đơn hàng đều có chi tiết đơn hàng đặc biệt). Vì vậy, bạn thường sẽ làm một liên kết trái từ mọi người để đặt hàng. Nhưng sau đó bạn phải tham gia vào chi tiết đặt hàng đặc biệt. Nếu bạn sử dụng một tham gia bên trong ở đó, nó sẽ thực sự biến liên kết bên trái từ mọi người thành các đơn hàng thành một tham gia bên trong. IE: đây là những gì bạn muốn làm nhưng không hoạt động (nó sẽ loại trừ bất kỳ ai không có đơn hàng đặc biệt):
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
Vì vậy, bạn có thể viết lại nó như thế này:
--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
Không chính xác rõ ràng (giả sử không có ý kiến), nhưng nó thực hiện công việc. Nếu đây là một cái gì đó nhiều hơn một lần (nghĩa là một cái gì đó mà ai đó sẽ phải quay lại và duy trì một ngày nào đó) bằng cách sử dụng một quyền tham gia đúng có thể làm cho nó rõ ràng hơn ý định là gì.
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
Đó là một chút ngắn gọn và rõ ràng hơn (nhưng chỉ khi bất cứ ai đang đọc nó hiểu đúng tham gia). Lưu ý rằng điều này có thể được viết bằng các phép nối trái, nhưng nó đòi hỏi một phép nối lồng nhau (điều mà ít người có thể quen thuộc hơn các phép nối phải).
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
Tại thời điểm này, đó là một sự lựa chọn về những gì rõ ràng nhất và những gì hầu hết mọi người sẽ hiểu (bạn có biết làm thế nào để google cú pháp đó nếu bạn không biết nó được gọi là tham gia lồng nhau?).
Nói tóm lại, bạn không thực sự cần tham gia đúng, nhưng chúng có thể giúp đọc dễ dàng hơn.