答案 0 :(得分:4)
LEFT [OUTER] JOIN
和RIGHT [OUTER] JOIN
可完全互换。
换句话说,以下四个连接子句将产生相同的结果行:
A LEFT JOIN B ON A.X = B.Y
B RIGHT JOIN A ON A.X = B.Y
A LEFT JOIN B ON B.Y = A.X -- switched A.X = B.Y around
B RIGHT JOIN A ON B.Y = A.X
结果完全没有区别。
这对程序员来说很方便。
另见这个问题:
这意味着这个问题的答案:
为什么我们使用Right join而不是交换表并使用left join?
就是这样:
因为你想使用Right join而不是Left join。以这种方式编写SQL可能更自然,或者你只是喜欢单词RIGHT而不是单词LEFT。
注意:如果你混合 LEFT和RIGHT加入同一个查询,你可能会得到一些奇怪的结果,但你没有提到这一点。
注意,这是语法。如果数据库引擎使用顺序来选择索引等,那么可能会导致执行性能的差异。然而,数据方面的最终结果应该完全相同。我不知道任何这样的表演技巧,所以可能没有,但很有可能。
如果由于表格排序而导致执行计划不同,可能也会导致生成的顺序不同。 IE浏览器。数据库引擎将选择一个表作为主表,并为另一个表执行散列连接或类似操作,这可能以不同的顺序返回行。 但是,除非您专门对行进行排序,否则包含相同行的两个结果集是等效的,即使它们没有相同顺序的行。我发现这比性能差异的可能性小,因为其中一个表总是可能为结果贡献比另一个更多的行,所以选择作为主数据应该是相同的。
答案 1 :(得分:0)
This是关于该主题的有趣文章/讨论。从答案我认为以下总结相当好(由Jeremiah Peschka):便利性,优化和它是ANSI标准。
便利性和优化。仅仅因为我们可以将查询编写为LEFT OUTER JOIN,并不意味着你应该这样做。 SQL Server提供了一个RIGHT OUTER JOIN showplan运算符(http://msdn.microsoft.com/en-us/library/ms190390.aspx)。有时候使用正确的外连接会最有效。在语言中保留该选项1)为您提供与优化器中使用的语言相同的功能,并且2)支持ANSI SQL规范。在一个足够复杂的SQL Server服务器上,总有一个机会,SQL Server可能会超时查询编译。理论上,如果指定RIGHT OUTER JOIN而不是LEFT OUTER JOIN,则SQL可以为SQL Server提供创建更好计划所需的提示。但是,如果你看到这种情况,你应该在博客上写一下:)
没有编程任务需要连接,但您也可以使用SELECT * FROM a,b,c,d WHERE(a.id = b.a_id或b.a_id IS NULL)等语法编写所有查询具有完全有效,格式良好且符合ANSI标准的SQL。