何时或为什么要使用正确的外连接而不是左连接?

维基百科指出:

“实际上,显式的右外连接很less被使用,因为它们总是可以被左外连接replace,并且不提供额外的function。

任何人都可以提供一个他们喜欢使用RIGHT符号的情况,为什么? 我想不出有什么理由去使用它。 对我来说,这不会让事情更清楚。

编辑:我是甲骨文退伍军人使新年的决议从(+)语法撤销自己。 我想做对的

我可以考虑使用RIGHT OUTER JOIN的唯一原因是尝试使SQL更加自我logging。

您可能想要使用左连接来查询,这些查询在一对多关系的依赖(多个)方面具有空行,对于在独立方面生成空行的那些查询的右连接。

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

我从来没有用过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 

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

 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 ... 

B RIGHT JOIN A与A LEFT JOIN B相同

B右连接A读取:B在右边,然后连接A.表示A位于数据集的左侧。 就像A LEFT JOIN B一样

如果您将LEFT JOIN重新排列到右侧,则无法获得性能。

我能想到为什么会使用RIGHT JOIN的唯一原因是如果你是喜欢从内部思考的人的types(select*从详细信息右连接标题)。 就像其他人喜欢小尾巴,其他喜欢大尾巴,其他喜欢自上而下的devise,其他喜欢自下而上的devise。

另一个是如果你已经有一个庞大的查询,你想添加另一个表,当重新排列查询是一个痛苦的脖子,所以只需使用RIGHT JOIN将表插入现有的查询。

唯一一次我想到一个正确的外连接是,如果我正在修复一个完整的连接,而且恰好如此,我需要结果来包含右侧表中的所有logging。 尽pipe我很懒,但是我可能会感到非常恼火,所以我会重新排列它来使用左连接。

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

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

如果你只是用RIGHTreplace单词FULL ,你有一个新的查询,而不必交换ON子句的顺序。

 SELECT * FROM table1 [BLANK] OUTER JOIN table2 ON table1.col = table2.col 

将[BLANK]replace为:

左 – 如果你想要所有来自table1的logging,即使他们没有一个col匹配table2(也包括table2logging匹配)

正确 – 如果你想要所有来自table2的logging,即使它们没有与table1匹配的col(也包括带有匹配的table1logging)

FULL – 如果你想要table1和table2的所有logging

大家在谈论什么? 他们是一样的? 我不这么认为。

我只使用正确连接的时候,我想查看两组数据,并且已经按照先前写入的查询的左连接或内连接的特定顺序进行了连接。 在这种情况下,假设您希望将一组数据看作不包含在表a中但是在表b中的logging,并且在另一种情况下将logging不包含在表b中,而是将其logging在表a中。 即使这样,我也倾向于这样做,以节省时间进行研究,但如果是不止一次运行的代码,就会改变它。

 SELECT * FROM table_a INNER JOIN table_b ON .... RIGHT JOIN table_c ON .... 

如何才能快速/轻松地join前两个表并jointable_c,同时确保table_c中的所有行始终处于选中状态?

我并没有真正想到正确的join,但是我想我已经有将近20年的时间来编写SQL查询了。 我已经看到了很多,我猜从开发人员使用内置查询构build器的地方。

每当我遇到一个,我已经重写了查询,以消除它 – 我发现他们只是需要太多的额外的精力,学习或重新学习,如果你没有访问了一段时间的查询,它没有“对于查询意图丢失或返回不正确的结果,这种情况并不常见 – 而且通常这种错误导致请求我回顾为什么查询不起作用。

在思考这个问题时,一旦你引入了一个正确的连接,你现在就有了我认为需要在中间碰面的逻辑分支。 如果引入了额外的要求/条件,这两个分支可能会进一步扩展,现在你有更多的复杂性,你不得不努力,以确保一个分支不会导致不正确的结果。

此外,一旦引入了正确的连接,稍后处理查询的其他经验较less的开发人员可以简单地将其他表添加到查询的右连接部分,从而扩展仍然需要满足的竞争逻辑stream中间; 或者在某些情况下,我已经看到,开始嵌套视图,因为他们不想触摸原始逻辑,也许在一定程度上,这是因为他们可能不了解推动逻辑的查询或业务规则。

除了正确之外,SQL语句应该尽可能简单易读,expression简洁(因为它们代表单个primefaces动作,而你的思维需要完全避免它们,以避免意外后果)。一个右外连接。

但是总是可以转化为另一个,而优化器将会与另一个一样好。

有一段时间,至less有一个主要的rdbms产品只支持LEFT OUTER JOIN。 (我相信这是MySQL。)

在一些SQL数据库中,有一些优化器提示告诉优化器按照它们出现在FROM子句中的顺序来join表 – 例如Oracle中的/*+ORDERED */ 。 在一些简单的实现中,这甚至可能是唯一可用的执行计划。

在这种情况下, FROM子句中的表的顺序很重要,所以RIGHT JOIN可能是有用的。

如果你没有正确的参与,我觉得很难。 与oracle的前。

 with a as( select 1 id, 'a' name from dual union all select 2 id, 'b' name from dual union all select 3 id, 'c' name from dual union all select 4 id, 'd' name from dual union all select 5 id, 'e' name from dual union all select 6 id, 'f' name from dual ), bx as( select 1 id, 'fa' f from dual union all select 3 id, 'fb' f from dual union all select 6 id, 'f' f from dual union all select 6 id, 'fc' f from dual ) select a.*, bf, xf from a left join bx b on a.id = b.id right join bx x on a.id = x.id order by a.id