下面是查询:
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 |
+----+-------+--------+-----------+
作为想法,此查询应显示所有雇主。一组具有 .ManagerId = b.Id 的行。
一切都很好用,expt行
Sam, NULL
Max, NULL
为什么这些行会返回。如果我在ON
子句中设置a.ManagerId is NOT NULL
。
a.Manager IS NOT NULL
引用表Employee a
的别名 而是将 NULL 值引用到别名表中Employee b
表的别名用作新分隔表所属的相关行
在 sql 中,当您需要原始表中的值用于不同的用途和连接时,这是典型的
您应该将表行视为数据集,别名是相同数据的单独集
编写查询时
SELECT x from A
LEFT JOIN B
ON A.b_id = b.id
选择所有表 A 并连接到 B。但所有 A 都被使用。
在示例A和B的情况下,表是相同的,但尽管如此。 我们有 A 表的完整列表,其中每行附加或未附加一行 B 表。
因此,要减少A表的行数,需要用WERE CLAUSE
来控制它
正确的查询将是
SELECT a.name as Employee, b.name as Manager from Employee as a
LEFT JOIN Employee as b
ON a.ManagerId = b.Id
WHERE a.ManagerId IS NOT NULL
ON
用于定义行附加到表的规则的子句WERE
子句筛选步骤 1 中的行。换句话说,在本例中,从 A 表中"剪切"了一些行。
当我使用ON FAlSE
时:它只选择 A 中的所有行,而不与 B 行连接。
SELECT a.name as Employee from Employee as a
LEFT JOIN Employee as b
ON false
WHERE 1
- 乔
- 亨利
- 山 姆
- 麦克斯
当我使用ON TRUE
它使用所有A
行B
次。
SELECT a.name as Employee from Employee as a
LEFT JOIN Employee as b
ON true
WHERE 1
{"headers": ["Employee"], "values":
[
["Joe"], ["Henry"], ["Sam"], ["Max"],
["Joe"], ["Henry"], ["Sam"], ["Max"],
["Joe"], ["Henry"], ["Sam"], ["Max"],
["Joe"], ["Henry"], ["Sam"], ["Max"]]}