当前位置:  开发笔记 > 后端 > 正文

有没有人使用Right Outer Joins?

如何解决《有没有人使用RightOuterJoins?》经验,为你挑选了4个好方法。

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

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

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



1> Petros..:

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

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

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

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


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

2> Martin Smith..:

举一个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



3> Ólafur Waage..:

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


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

4> Eppz..:

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

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有