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

Pra*_*ddy 5 sql-server

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

ang*_*son 6

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
Run Code Online (Sandbox Code Playgroud)

结果完全没有区别。

这对您作为程序员来说很方便。

另见这个问题:

这意味着这个问题的答案:

为什么我们使用右连接而不是我们可以交换表并使用左连接?

这是:

因为您想使用右连接而不是左连接。以这种方式编写 SQL 可能更自然,或者您只是喜欢 RIGHT 这个词而不是 LEFT 这个词。

注意:如果您在同一个查询中混合使用LEFT 和 RIGHT 连接,您可能会得到一些奇怪的结果,但您没有提到这些。


请注意,这是语法。有可能,如果数据库引擎使用的以挑选指标和类似的在执行性能差异。然而,数据方面的最终结果应该是完全相同的。我不知道任何这样的表演技巧,所以可能没有,但很可能有。

如果执行计划因表排序而不同,则结果顺序也可能有所不同。IE。数据库引擎将选择一个表作为主表,并为另一个表执行散列连接或类似操作,这可能会以不同的顺序返回行。但是,除非您专门对行进行排序,否则包含相同行的两个结果集是等效的,即使它们的行顺序不同。我发现这比性能差异的可能性要小,因为其中一个表总是可能比另一个表为结果贡献更多的行,所以选择哪个作为主节点应该是相同的。