Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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/1/visual-studio-2012/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
正在努力解释此SQL连接语法_Sql_Sql Server_Join_Left Join_Inner Join - Fatal编程技术网

正在努力解释此SQL连接语法

正在努力解释此SQL连接语法,sql,sql-server,join,left-join,inner-join,Sql,Sql Server,Join,Left Join,Inner Join,两个非常相似的查询: 问题#1: 问题2: 但显然,两种语言的语法截然不同 我学习这些新语法概念的最佳方法是将它们解释为通俗易懂的英语。那么,你如何描述他们正在选择什么呢 我希望它们会产生相同的结果,但我觉得第二个查询中的左连接在某种程度上充当了内部连接——因为返回了我的结果集的一小部分(即支付了款项的员工) 如果第一个查询“说”“给我所有员工,以及任何可用的员工付款(已经加入他们的付款记录)”-第二个查询说什么 如果第一个查询“告诉我所有员工,以及任何可用的员工付款(已与他们的付款记录合并)”

两个非常相似的查询:

问题#1:

问题2:

但显然,两种语言的语法截然不同

我学习这些新语法概念的最佳方法是将它们解释为通俗易懂的英语。那么,你如何描述他们正在选择什么呢

我希望它们会产生相同的结果,但我觉得第二个查询中的
左连接
在某种程度上充当了
内部连接
——因为返回了我的结果集的一小部分(即支付了款项的员工)

如果第一个查询“说”“给我所有员工,以及任何可用的员工付款(已经加入他们的付款记录)”-第二个查询说什么

如果第一个查询“告诉我所有员工,以及任何可用的员工付款(已与他们的付款记录合并)”-第二个查询说什么

我想你可以把它写成“把所有员工连同所有可用的员工工资一起带去。把它和工资记录一起带去。”

“将此与付款记录合并”是筛选出没有任何关联的员工付款记录的员工的功能:尝试与付款记录合并将失败

但我觉得第二个查询中的左连接在某种程度上充当了内部连接

进行过滤的不是左连接,但它确实给出了完全相同的结果,就像左连接是内部连接一样

如果第一个查询“告诉我所有员工,以及任何可用的员工付款(已与他们的付款记录合并)”-第二个查询说什么

我想你可以把它写成“把所有员工连同所有可用的员工工资一起带去。把它和工资记录一起带去。”

“将此与付款记录合并”是筛选出没有任何关联的员工付款记录的员工的功能:尝试与付款记录合并将失败

但我觉得第二个查询中的左连接在某种程度上充当了内部连接


进行过滤的不是左连接,但它确实给出了与左连接是内部连接时完全相同的结果。

为了理解连接发生的逻辑顺序,您需要查看
上的
子句。对于遇到的每个
ON
子句,将其与之前最接近的尚未处理的
JOIN
子句配对。这意味着您的第一个查询是:

INNER JOIN ep to p (producing, say, ep')
LEFT JOIN e to ep'
LEFT JOIN e to ep (producing, say, e')
INNER JOIN e' to p
第二个问题是:

INNER JOIN ep to p (producing, say, ep')
LEFT JOIN e to ep'
LEFT JOIN e to ep (producing, say, e')
INNER JOIN e' to p
由于
内部联接的条件取决于
ep
中的列,因此不同联接顺序在这里很重要



1逻辑连接顺序决定结果集的最终形状。SQL Server可以按其认为合适的任何顺序执行联接,但它必须生成与逻辑联接顺序一致的结果。

要了解联接发生的逻辑顺序1,您需要查看
子句上的
。对于遇到的每个
ON
子句,将其与之前最接近的尚未处理的
JOIN
子句配对。这意味着您的第一个查询是:

INNER JOIN ep to p (producing, say, ep')
LEFT JOIN e to ep'
LEFT JOIN e to ep (producing, say, e')
INNER JOIN e' to p
第二个问题是:

INNER JOIN ep to p (producing, say, ep')
LEFT JOIN e to ep'
LEFT JOIN e to ep (producing, say, e')
INNER JOIN e' to p
由于
内部联接的条件取决于
ep
中的列,因此不同联接顺序在这里很重要



1逻辑连接顺序决定结果集的最终形状。SQL Server可以按其认为合适的任何顺序执行联接,但它必须生成与逻辑联接顺序一致的结果。

其中一个有语法错误,另一个没有。@jarlh从我所知,他们都没有语法错误。需要详细说明吗?
内部连接
左连接
都需要一个
ON
子句。(
CROSS-JOIN
是唯一没有它的。)@jarlh都有一个
ON
子句<代码>在cond上的左连接(在cond上的b内部连接c)是完全有效的,不需要括号。哎呀,好像我在这里错了。。。它们在语法上都是正确的!其中一个有语法错误,另一个没有。据我所知,他们两个都没有语法错误。需要详细说明吗?
内部连接
左连接
都需要一个
ON
子句。(
CROSS-JOIN
是唯一没有它的。)@jarlh都有一个
ON
子句<代码>在cond上的左连接(在cond上的b内部连接c)是完全有效的,不需要括号。哎呀,好像我在这里错了。。。它们在语法上都是正确的!啊好的,很好!我喜欢这样的解释。可能值得指出的是,这意味着
左连接实际上变成了
内部连接,因此将这样的查询留给
左连接只会让未来的维护人员感到困惑。@Damien_不信者谢谢,OP已经注意到,但这确实值得一提。啊,好的,很好!我喜欢这样的解释。可能值得指出的是,这意味着
左连接实际上变成了
内部连接,因此将这样的查询留给
左连接只会让未来的维护人员感到困惑。@Damien_不信者谢谢,OP已经注意到,但这确实值得一提。我高举了“sql server中的连接顺序”和几篇文章,上面说“哪个连接将首先执行取决于查询计划……此外,产生最小结果集的连接是先连接,依此类推”。还有很多其他因素。示例链接@KumarHarsh-我指的是逻辑连接顺序。也就是说,SQL Server必须生成与之一致的结果的联接操作顺序。实际上,它可以根据自己的需要自由地重新排序联接