【发布时间】:2020-02-17 18:54:07
【问题描述】:
这里是查询:
SELECT a.name as Employee, b.name as Manager from Employee as a
LEFT JOIN Employee as b
ON a.ManagerId = b.Id AND a.ManagerId IS NOT NULL
WHERE 1
它适用于这张桌子:
+----+-------+--------+-----------+
| Id | Name | Salary | ManagerId |
+----+-------+--------+-----------+
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | NULL |
| 4 | Max | 90000 | NULL |
+----+-------+--------+-----------+
作为 Idea,此查询应显示所有雇主。一组具有 a.ManagerId = b.Id 的行。
一切正常,除了行
Sam, NULL
Max, NULL
为什么这些行返回。如果我在ON 子句中设置a.ManagerId is NOT NULL。
【问题讨论】:
-
NULL 是一头奇怪的野兽。这就是为什么。
-
我想你可以参考这里更清楚地了解加入条件的“on”和“where”阶段之间的区别。 stackoverflow.com/questions/354070/…
-
不是因为 NULL,而是因为“ON”是如何工作的。 'ON' 通过某些规则给出与 B 行连接的所有 A 行。无论如何,所有 A 行都将显示在答案中。在过滤 A 行旁边,需要使用“WERE”。在这种情况下,为
ON添加一条规则,它没有为 ManagerID 为 NULL 的情况附加 B 行,但它不会拒绝这些行。 -
无论你在 ON 子句中写什么,你都会得到来自
a的所有行。这就是 LEFT JOIN 的工作原理。 -
@PaulSpiegel 说得更正确,至少会使用 A 形式的所有行。万一ON FALSE,万一ON TRUE将是A行B次。