有没有人使用Right Outer Joins?

时间:2009-03-27 14:24:25

标签: sql

我一直使用INNER JOIN和LEFT OUTER JOIN。但是,我似乎永远不需要RIGHT OUTER JOIN。

我已经看到很多讨厌的自动生成的SQL使用正确的连接,但对我来说,这段代码是不可能的。我总是需要使用内部和左侧连接重写它来制作它的头部或尾部。

有没有人真正使用Right joins编写查询?

9 个答案:

答案 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:MySQLPostgreSQLSQL 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)

很少,如上所述,您通常可以重新排序并使用左连接。此外,我自然倾向于对数据进行排序,因此左连接可用于获取我需要的数据。我认为完全外部和交叉连接也是如此,大多数人都倾向于远离它们。