有没有人使用右外连接?
我一直使用INNER JOIN和LEFT OUTER JOIN。 但是,我永远都不需要RIGHT OUTER JOIN。
我见过很多令人讨厌的自动生成的SQL使用正确的连接,但对我来说,代码是不可能得到我的头。 我总是需要用内部和左边的连接来重写它,使它成为正面或反面。
有没有人真正用右连接写查询?
这取决于你放在每个表的连接的哪一侧。
如果要返回左表中的所有行,即使右表中没有匹配,也可以使用左连接。
如果要返回右表中的所有行,即使左表中没有匹配,也可以使用右连接。
有趣的是,我很less使用正确的连接。
举一个例子, RIGHT JOIN
可能是有用的。
假设人,宠物和宠物用品有三张桌子。 人们可以select有宠物,这些宠物可以select有配件
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');
如果要求得到一个结果列出所有的人,不pipe他们是否拥有一个宠物,以及他们拥有的也有配件的宠物的信息。
这不起作用 (不包括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;
这是行得通的 (但是语法要less得多,因为它需要两个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就是引入一个派生表,可以将它们留在一起
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小提琴: MySQL , PostgreSQL , SQL Server
您通常使用RIGHT OUTER JOINS来查找其他表格中的孤立项目。
不,我不是因为简单的原因,我可以完成所有的内部或左连接。
唯一一次我使用右外部联接是当我在一个现有的查询工作,并需要改变它(通常是从一个内部)。 我可以将连接反转,使其成为左边,也许是可以的,但是当我修改代码时,我会尽量减less更改的内容。
我只用左边,但让我说,他们是真的一样,取决于你如何订购的东西。 我和一些只使用正确的人一起工作,因为他们从内到外build立了疑问,并且喜欢把他们的主要项目保留在底部,因此在他们的心目中只有正确使用才有意义。
即
这里有主要的东西
需要更多的垃圾
更多垃圾右外连接主要的东西
我喜欢做主要的东西,然后垃圾…所以留给我的外部作品。
所以,无论漂浮你的船。
我们在这里的标准做法是尽可能地用LEFT JOIN来写所有的东西。 我们偶尔会使用FULL OUTER JOIN,如果我们需要的话,但是从来没有RIGHT JOIN。
您可以使用LEFT或RIGHT连接完成相同的操作。 一般来说,大多数人认为左边join可能是因为我们从左到右阅读。 这真的是一致的。 你的团队应该专注于使用左或右连接,而不是两者,因为它们本质上是相同的,写作不同。
很less如前所述,您通常可以重新sorting并使用左连接。 另外我自然倾向于sorting数据,所以左连接工作获取我需要的数据。 我认为完全外在的交叉连接也是如此,大多数人倾向于远离他们。