努力解释这个 SQL 连接语法

Struggling to interpret this SQL join syntax

两个非常相似的查询:

查询 #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 - 因为我的结果集的一小部分被退回(即有付款的员工)。

如果第一个查询'says' "give me all employees, along with any available employee_payments (that have already been joined with their payment record)"-第二个查询说什么?

If the first query 'says' "give me all employees, along with any available employee_payments (that have already been joined with their payment record)"- what does the second query say?

我想你可以把它写成 "Take all employees along with any available employee_payments. Join this with the payment records."

"Join this with the payment records" 过滤掉没有任何关联 employee_payments 记录的员工:尝试加入付款记录将失败。

but it feels to me like the LEFT JOIN in the second query acts as an INNER JOIN somehow

过滤的不是 LEFT JOIN,但它确实给出了与 LEFT JOIN 是 INNER JOIN 完全相同的结果。

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