Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用ANSI联接的标准SQL中,表达式或谓词的顺序是否会对外部联接的联接条件产生任何影响?_Sql - Fatal编程技术网

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

在使用ANSI联接的标准SQL中,表达式或谓词的顺序是否会对外部联接的联接条件产生任何影响?,sql,Sql,以典型的左外连接场景为例。我们都知道,表格的顺序非常重要,例如,Q1和Q2是不等价的: 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) 当我从概念上考虑多个连接时,我通常会自然而然地想象将新表作为感兴趣的对象,然后描述它的行如何与前面的行相关联。保持这些条件并行对我没有任何好处,并且根据我

以典型的左外连接场景为例。我们都知道,表格的顺序非常重要,例如,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)
当我从概念上考虑多个连接时,我通常会自然而然地想象将新表作为感兴趣的对象,然后描述它的行如何与前面的行相关联。保持这些条件并行对我没有任何好处,并且根据我自己的习惯,我通常以以下方式编写连接条件:

SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON B.id = A.id -- (Q3)
我与一位前同事进行了一次对话,他误解了语法的工作原理。对这位同事来说,Q3是错误的,Q1是正确的。我确实认识到,对于旧式的外部连接语法,这很重要,这可能是这种混乱的根源。我从来没有听说或见过其他人使用ANSI连接来证明这一点。请回答这个问题,挽回我的名誉,指出我忽略的东西,或者对错误的观点提供更深入的见解


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

相等比较的顺序对联接的结果没有影响。但由于难以理解的原因,它可能会影响计算结果的效率。SQL优化器因受到这样看似不重要的细节的影响而臭名昭著。

不,这没有什么区别

就我个人而言,我更喜欢你在第三季度展示的风格,我的一些同事更喜欢第一季度的风格。我不知道有谁会认为他们中的任何一个都错了。 查询优化程序将查询从内到外转换为完全不同的内容,因此谓词在处理完后甚至不再作为简单的比较而存在。通常是在索引或表中进行查找,由于只能在一个方向上进行查找,因此谓词的编写方式没有任何区别


我(在SQL Server 2005中)检查了两个谓词操作数顺序不同的查询的执行计划,正如预期的那样,它们是相同的。

我也更喜欢Q3的联接条件顺序:

... ON B.id = A.id -- (Q3)
因为它直接反映了B.id是变化较大的一个,所以您可以将A.id视为被测试的常数,例如

B.id = 1984
就像我不想在代码中看到的那样

1984 = B.id
…和你一样,我不想在查询中看到这一点:

A.id = B.id
然而,就像生活中的大多数事情一样,有些人喜欢小恩迪安,有些人喜欢大恩迪安。无论他们选择什么样的心理模式,他们至少应该能够向你解释他们想要
A.id=B.id

我想,我必须改变我的偏好,我(和你)的偏好条件顺序在某些ORM中不起作用,特别是Linq。我还不明白他们为什么规定条件应该按照Q1的顺序:

from x in A
join y in B on x.id equals y.id
将条件(与Q3相同,但在SQL查询中不是错误)顺序结果转换为语法错误,Linq不会接受这一点:

from x in A
join y in B on y.id equals x.id
现在,我必须找到为什么微软Linq设计师更喜欢Q1条件的订单的理由。如果它有意义,试着去欣赏它,即使它(还)没有意义,也要接受它


关于:

表达式或谓词的顺序是否会对 标准SQL中外部联接的联接条件

结果方面,。就性能而言,我还没有看到连接的条件顺序使查询更快的查询。即使在论坛上,我也没有看到有人赞成改变条件以加快查询速度


如果他们无法向您解释其首选条件订单服务的基本原理或心理模型,也许他们只是在做或更糟,

我更喜欢您的Q1,但是它在性能上绝对没有差异,对查询优化器也绝对没有影响

对我来说,在扫描过程中,先放上一张表可以更快地获得相关信息。我可以阅读…上的
联接表B,并且已经知道哪两个表正在联接在一起。当我阅读B.blasdjasdid=…
上的join table B时,我不得不进一步扫描,仍然不知道最重要的信息,即连接到哪个表(这是一种名称空间,可以理解列名的域)。此外,如果两个表中的列名称相同(在我设计的任何数据库中都是惯用的),我可以避免完全扫描到底,只读取A.SomethingId…上的
联接表B,并且已经知道它是
=B.SomethingId


再深入一点,我鼓励你问一下这件事,因为我怀疑你停止服务的原因与他们告诉你的不符;对此进行一些调查可能会有成效。我不是说这是你的错,而是说给出的理由可能是个借口。

我也考虑过货运邪教。我曾希望让我的同事说出她的思维过程,这样我就可以找出困惑。有些盲人表示,他们对那些不想看到和学习的人感到非常沮丧。我想这和我现在学习的核心和方向差不多。下面是另一个例子:谢谢你发表这篇文章。我希望它特别提到外部连接。我认为困惑的核心是这个概念。嗯。。也许:-)也许她认为当你做
A/*first*/左外接B/*second*/
,你也应该做
在A/*first*/.ID=B/*second*/.ID上。如果她只知道四大巨头(Oracle、Sql Server、Postgresql、MySQL)中的三个(Oracle、Postgresql、MySQL)支持这种