表达式或谓词的顺序对使用ANSI联接的标准SQL中的外部联接的联接条件是否有任何影响?

sha*_*t00 3 sql

采取典型的左外部联接方案。我们都知道表的顺序非常重要,例如Q1Q2不相等:

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON A.id = B.id -- (Q1)
SELECT A.x, B.y FROM B LEFT OUTER JOIN A ON B.id = A.id -- (Q2)
Run Code Online (Sandbox Code Playgroud)

当我从概念上考虑多个联接时,对我来说通常可以想象将新表选为感兴趣的对象,然后描述其表行与之前的内容之间的关系。保持术语并行对我没有任何好处,按照我自己的习惯,我通常以这种方式编写连接条件:

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON B.id = A.id -- (Q3)
Run Code Online (Sandbox Code Playgroud)

我与一位前同事交谈,后者误解了语法的工作原理。对于这个同事来说,第三季度是错误的,第一季度是正确的。而且我确实意识到,使用老式的外部联接语法很重要,这很可能是造成混淆的原因。我从未听说过或看到其他人使用ANSI联接进行这种情况。请回答此问题并兑现我的声誉,指出我忽略的问题,或者对错误的观点提供更深入的了解。

表达式或谓词的顺序对使用ANSI联接的标准SQL中的外部联接的联接条件是否有任何影响?

Guf*_*ffa 5

不,没关系。

就我个人而言,我更喜欢您在第三季度展示的风格,我的一些同事更喜欢在第一季度展示的风格。我不知道有谁会认为他们中的任何一个错误

查询优化程序将查询由内到外变成了完全不同的内容,因此完成谓词后,该谓词甚至不再作为简单的比较而存在。通常,它是在索引或表中进行查找,并且由于只能在一个方向上进行,因此谓词的编写方式没有任何区别。

我在SQL Server 2005中检查了两个查询的执行计划,这些查询的谓词操作数的顺序不同,并且按预期它们是相同的。