为什么我们不能通过交换表而不是右外连接来使用左外连接?

时间:2014-11-12 12:24:20

标签: sql-server

几天前,我在接受采访时遇到了以下问题。 “什么是右外连接?” 我回答说,“右外连接连接两个表,并从表中返回匹配的记录以及表A中的非匹配行”。 面试官只是笑了,又问道:“为什么我们使用Right join而不是我们可以交换表并使用左连接?”。然后我的回答是,“是的,我们可以使用”。但是,他认为“那么为什么两个概念加入了?(左和右)”。我真的对这个问题感到困惑。请帮助我,并纠正我对连接的理解。

2 个答案:

答案 0 :(得分:4)

如果您重新排列表格的顺序,

LEFT [OUTER] JOINRIGHT [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。