用右连接没有(我知道的)可以用左连接完成的任何事情。但是有时左连接的语法比较丑陋。假设您有以下表格:
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
在这一点上,可以选择最清楚的内容以及大多数人会理解的内容(如果您不知道该语法称为嵌套联接,您是否会知道该语法?)
简而言之,您不一定严格要求正确的联接,但是它们可能使阅读更容易。