苦苦挣扎来解释这种SQL连接语法

时间:2016-04-22 10:07:22

标签: sql sql-server join left-join inner-join

两个非常相似的查询:

查询#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(已经加入了他们的付款记录)“ - 第二个查询说了什么?

2 个答案:

答案 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可以按照它认为合适的任何顺序自由执行连接,但它必须产生与逻辑连接顺序一致的结果。