当前位置:  开发笔记 > 数据库 > 正文

何时或为何使用右外连接而不是左?

如何解决《何时或为何使用右外连接而不是左?》经验,为你挑选了4个好方法。

维基百科说:

"在实践中,很少使用明确的右外连接,因为它们总是可以用左外连接替换,并且不提供额外的功能."

任何人都可以提供他们更喜欢使用正确表示法的情况,为什么?我想不出使用它的理由.对我来说,它永远不会让事情更清楚.

编辑:我是甲骨文老将制作新年决议,以便从(+)语法中脱离自己.我想做得对



1> Yes - that J..:

我能想到使用RIGHT OUTER JOIN的唯一原因是尝试让你的SQL更加自我记录.

你有可能会想使用左联接为有一个一对多的关系的依赖(多)边空行和右连接于那些产生于独立的侧空行查询的查询.

这也可能发生在生成的代码中,或者商店的编码要求指定FROM子句中表的声明顺序.


+1,如果它总结了你,迈克尔和伊万的话会接受答案.

2> Roman Pekar..:

我以前从未使用right join过,从未想过我真的需要它,而且看起来有点不自然.但是在我考虑它之后,它可能在这种情况下非常有用,当你需要将一个表外连接到多个表的交集时,所以你有这样的表:

在此输入图像描述

并希望得到这样的结果:

在此输入图像描述

或者,在SQL(MS SQL Server)中:

declare @temp_a table (id int)
declare @temp_b table (id int)
declare @temp_c table (id int)
declare @temp_d table (id int)

insert into @temp_a
select 1 union all
select 2 union all
select 3 union all
select 4

insert into @temp_b
select 2 union all
select 3 union all
select 5

insert into @temp_c
select 1 union all
select 2 union all
select 4

insert into @temp_d
select id from @temp_a
union
select id from @temp_b
union
select id from @temp_c

select *
from @temp_a as a
    inner join @temp_b as b on b.id = a.id
    inner join @temp_c as c on c.id = a.id
    right outer join @temp_d as d on d.id = a.id

id          id          id          id
----------- ----------- ----------- -----------
NULL        NULL        NULL        1
2           2           2           2
NULL        NULL        NULL        3
NULL        NULL        NULL        4
NULL        NULL        NULL        5

因此,如果切换到left join,结果将不一样.

select *
from @temp_d as d
    left outer join @temp_a as a on a.id = d.id
    left outer join @temp_b as b on b.id = d.id
    left outer join @temp_c as c on c.id = d.id

id          id          id          id
----------- ----------- ----------- -----------
1           1           NULL        1
2           2           2           2
3           3           3           NULL
4           4           NULL        4
5           NULL        5           NULL

没有正确连接的唯一方法是使用公用表表达式或子查询

select *
from @temp_d as d
    left outer join (
        select *
        from @temp_a as a
            inner join @temp_b as b on b.id = a.id
            inner join @temp_c as c on c.id = a.id
    ) as q on ...


您不需要嵌套SELECT,您可以嵌套连接:`FROM @temp_d AS d LEFT OUTER JOIN(temp_a AS INNER JOIN @temp_b AS b ON b.id = a.id INNER JOIN @temp_c AS c ON c.id = a.id)ON a.id = d.id`.(括号是不必要的,添加它们只是为了便于阅读.)但是,确实有人不确定他们厌恶哪种语法,嵌套连接或右外连接,所以右连接可能有效*对他们来说不那么糟糕.:)

3> Michael Buen..:

B RIGHT JOIN A与A LEFT JOIN B相同

B RIGHT JOIN A读取:B ON RIGHT,THEN JOINS A.表示A位于数据集的左侧.与A LEFT JOIN B相同

如果您将LEFT JOIN重新排列为RIGHT,则无法获得任何性能.

我能想到为什么一个人会使用RIGHT JOIN的唯一原因就是你喜欢从内到外思考的人(选择*来自细节右连接头).它就像其他像小端,其他像大端,其他像自上而下的设计,其他像自下而上的设计.

另一个是如果你已经有一个大的查询,你想要添加另一个表,当颈部重新排列查询时,所以只需使用RIGHT JOIN将表插入现有查询.



4> Bill the Liz..:

我认为一个右外的唯一一次参加是,如果我被固定一个完整的加盟,它只是碰巧,我需要的结果包含在右表中的所有记录.即使懒惰的我,虽然,我可能会得到这么生气,我会重新安排它使用左连接.

维基百科的这个例子显示了我的意思:

SELECT *  
FROM   employee 
   FULL OUTER JOIN department 
      ON employee.DepartmentID = department.DepartmentID

如果您只是替换单词FULL,则RIGHT您有一个新查询,而无需交换该ON子句的顺序.


`FULL`有它的目的,并不总是需要"修复",用'RIGHT'替换它不会做同样的事情.如果您正在构建报告以帮助公司验证员工部门分配并希望包括没有员工的部门以及尚未分配到部门的员工,该怎么办?
推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有