我一直使用INNER JOIN和LEFT OUTER JOIN.但是,我似乎永远不需要RIGHT OUTER JOIN.
我已经看到很多讨厌的自动生成的SQL使用正确的连接,但对我来说,这段代码是不可能的.我总是需要使用内部和左侧连接重写它来制作它的头部或尾部.
有没有人真正使用Right连接编写查询?
这取决于您放置每个表的连接的哪一侧.
如果要返回左表中的所有行,即使右表中没有匹配项,也可以使用左连接.
如果要从右表中返回所有行,即使左表中没有匹配项,也使用右连接.
有趣的是,我很少使用正确的连接.
举一个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');
如果要求获得结果列出所有人,无论他们是否拥有宠物,以及他们拥有的任何宠物的信息也有配件.
这不起作用(不包括鲍勃)
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
您通常使用RIGHT OUTER JOINS在其他表中查找孤立项.
不,我不是因为我能用内部或左连接完成所有事情的简单原因.