我一直使用INNER JOIN和LEFT OUTER JOIN。但是,我似乎永远不需要RIGHT OUTER JOIN。
我已经看到很多讨厌的自动生成的SQL使用正确的连接,但对我来说,这段代码是不可能的。我总是需要使用内部和左侧连接重写它来制作它的头部或尾部。
有没有人真正使用Right joins编写查询?
答案 0 :(得分:25)
这取决于你把每张桌子放在哪一边。
如果要返回左表中的所有行,即使右表中没有匹配项,也可以使用左连接。
如果要返回右表中的所有行,即使左表中没有匹配项,也使用右连接。
有趣的是,我很少使用正确的连接。
答案 1 :(得分:24)
举一个RIGHT JOIN
可能有用的例子。
假设人,宠物和宠物配件有三个表。人们可以选择养宠物,这些宠物可以选配配件
CREATE TABLE Persons
(
PersonName VARCHAR(10) PRIMARY KEY
);
INSERT INTO Persons
VALUES ('Alice'),
('Bob'),
('Charles');
CREATE TABLE Pets
(
PetName VARCHAR(10) PRIMARY KEY,
PersonName VARCHAR(10)
);
INSERT INTO Pets
VALUES ('Rover',
'Alice'),
('Lassie',
'Alice'),
('Fifi',
'Charles');
CREATE TABLE PetAccessories
(
AccessoryName VARCHAR(10) PRIMARY KEY,
PetName VARCHAR(10)
);
INSERT INTO PetAccessories
VALUES ('Ball', 'Rover'),
('Bone', 'Rover'),
('Mouse','Fifi');
如果要求的结果是列出所有人,无论他们是否拥有宠物,以及他们拥有的任何宠物的信息,也有配件。
此不起作用(不包括Bob)
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
ON P.PersonName = Pt.PersonName
INNER JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName;
此不起作用(包括Lassie)
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
ON P.PersonName = Pt.PersonName
LEFT JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName;
确实有用(但语法通常不太明白,因为它需要连续两个ON
子句来实现所需的逻辑连接顺序)
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Persons P
LEFT JOIN Pets Pt
INNER JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName
ON P.PersonName = Pt.PersonName;
总而言之,最容易使用RIGHT JOIN
SELECT P.PersonName,
Pt.PetName,
Pa.AccessoryName
FROM Pets Pt
JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName
RIGHT JOIN Persons P
ON P.PersonName = Pt.PersonName;
虽然如果决定避免这种情况,那么另一种选择是引入一个可以保持联接的派生表
SELECT P.PersonName,
T.PetName,
T.AccessoryName
FROM Persons P
LEFT JOIN (SELECT Pt.PetName,
Pa.AccessoryName,
Pt.PersonName
FROM Pets Pt
JOIN PetAccessories Pa
ON Pt.PetName = Pa.PetName) T
ON T.PersonName = P.PersonName;
SQL Fiddles:MySQL,PostgreSQL,SQL Server
答案 2 :(得分:9)
您通常使用RIGHT OUTER JOINS来查找其他表中的孤儿项目。
答案 3 :(得分:6)
不,我不是因为我能用内部或左连接完成所有事情的原因。
答案 4 :(得分:2)
我使用Right外连接的唯一时间是我正在处理现有查询并需要更改它(通常来自内部)。我可以反转连接并使其成为左侧并且可能没问题,但是我尝试减少修改代码时更改的内容。
答案 5 :(得分:2)
我只使用左,但让我说他们真的是一样的,取决于你如何订购东西。我与一些只使用正确的人一起工作,因为他们从内到外构建了查询,并且喜欢将他们的主要项目保持在底部,因此在他们的脑海中只有正确使用才有意义。
即
这里有主要的东西
需要更多垃圾
更多垃圾右外连接主要内容
我更喜欢做主要的东西然后垃圾...所以留下外面的东西为我。
所以无论什么漂浮在你的船上。
答案 6 :(得分:1)
我们的标准做法是尽可能用LEFT JOIN编写所有内容。如果我们需要,我们偶尔会使用FULL OUTER JOIN,但从不使用RIGHT JOIN。
答案 7 :(得分:1)
您可以使用LEFT或RIGHT联接完成相同的操作。一般来说,大多数人都认为LEFT连接可能是因为我们从左到右阅读。这真的归结为一致。你的团队应该专注于使用LEFT或RIGHT联接,而不是两者,因为它们基本上是完全相同的,用不同的方式编写。
答案 8 :(得分:1)
很少,如上所述,您通常可以重新排序并使用左连接。此外,我自然倾向于对数据进行排序,因此左连接可用于获取我需要的数据。我认为完全外部和交叉连接也是如此,大多数人都倾向于远离它们。