正在努力解释此SQL连接语法
两个非常相似的查询: 问题#1: 问题2: 但显然,两种语言的语法截然不同 我学习这些新语法概念的最佳方法是将它们解释为通俗易懂的英语。那么,你如何描述他们正在选择什么呢 我希望它们会产生相同的结果,但我觉得第二个查询中的正在努力解释此SQL连接语法,sql,sql-server,join,left-join,inner-join,Sql,Sql Server,Join,Left Join,Inner Join,两个非常相似的查询: 问题#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必须生成与之一致的结果的联接操作顺序。实际上,它可以根据自己的需要自由地重新排序联接