两个非常相似的查询:
查询#1:
SELECT *
FROM employee e
LEFT JOIN employee_payments ep
INNER JOIN payments p ON ep.payment_id = p.id
ON ep.employee_id = e.id
查询#2:
SELECT *
FROM employee e
LEFT JOIN employee_payments ep ON ep.employee_id = e.id
INNER JOIN payments p ON ep.payment_id = p.id
但显然不同的语法。
我最好地学习这些新语法概念的方法是将它们解释为普通英语。那么你怎么能描述这些选择的内容呢?
我希望他们会产生相同的结果,但我感觉像第二个查询中的LEFT JOIN
以某种方式充当INNER JOIN
- 因为我的结果集的一小部分被返回(即有付款的员工)。
如果第一个查询'说''给我所有员工,以及任何可用的employee_payments(已经加入了他们的付款记录)“ - 第二个查询说了什么?
答案 0 :(得分:2)
如果第一个查询'说' "给我所有员工,以及任何可用的employee_payments(已经加入他们的付款记录)" - 第二个查询说什么?
我想你可以把它作为"让所有员工和任何可用的employee_payments一起。加入付款记录。"
"加入支付记录"过滤掉没有任何关联的employee_payments记录的员工:尝试加入付款记录将会失败。
但我感觉像第二个查询中的LEFT JOIN以某种方式充当INNER JOIN
它不是LEFT JOIN进行过滤,但确实给出了与LEFT JOIN是INNER JOIN完全相同的结果。
答案 1 :(得分:1)
为了理解连接发生的逻辑顺序 1 ,您需要查看ON
子句。对于您遇到的每个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
中的列,因此这就是为什么不同的连接顺序在这里很重要。
1 逻辑连接顺序确定结果集的最终形状。 SQL Server可以按照它认为合适的任何顺序自由执行连接,但它必须产生与逻辑连接顺序一致的结果。