有没有人使用Right Outer Joins?

KM.*_*KM. 35 sql

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

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

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

Pet*_*ros 25

这取决于您放置每个表的连接的哪一侧.

如果要返回左表中的所有行,即使右表中没有匹配项,也可以使用左连接.

如果要从右表中返回所有行,即使左表中没有匹配项,也使用右连接.

有趣的是,我很少使用正确的连接.

  • 我总是发现从包含所有非孤立项的表开始更合乎逻辑,所以我总是最终使用LEFT JOIN.我想知道它是否是一种文化的东西? (11认同)
  • +1,左右外连接完全相同,只是相反. (5认同)

Mar*_*ith 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');
Run Code Online (Sandbox Code Playgroud)

如果要求获得结果列出所有人,无论他们是否拥有宠物,以及他们拥有的任何宠物的信息也有配件.

不起作用(不包括鲍勃)

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; 
Run Code Online (Sandbox Code Playgroud)

不起作用(包括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; 
Run Code Online (Sandbox Code Playgroud)

确实有效(但语法很少被理解,因为它需要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;
Run Code Online (Sandbox Code Playgroud)

总而言之,最容易使用的是 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;
Run Code Online (Sandbox Code Playgroud)

虽然如果决定避免这种情况,那么另一个选择是引入一个可以保持连接的派生表

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; 
Run Code Online (Sandbox Code Playgroud)

SQL Fiddles:MySQL,PostgreSQL,SQL Server

  • 如果你不明白为什么可怜的鲍勃被排除在外,这对我有帮助:http://weblogs.sqlteam.com/jeffs/archive/2007/10/11/mixing-inner-outer-joins-sql.aspx (2认同)

Óla*_*age 9

您通常使用RIGHT OUTER JOINS在其他表中查找孤立项.

  • 我发现这个答案使得正确的连接听起来很特别.左外连接和右外连接是彼此的镜像 - 两者都可用于查找孤立的项目.选择使用哪个只是基于您想要所有行的表,即使没有匹配. (17认同)

Epp*_*ppz 6

不,我不是因为我能用内部或左连接完成所有事情的简单原因.