简单的 PostgreSQL 自连接
Simple PostgreSQL Self Join
这就是我的 employee
table 的样子 其中 manager_id
是同一个 table 的外键,它引用 employee_id
并指示哪个员工有经理,谁是。
employee_id | first_name | last_name | manager_id
-------------+------------+-------------+------------
1 | Windy | Hays |
2 | Ava | Christensen | 1
3 | Hassan | Conner | 1
4 | Anna | Reeves | 2
5 | Sau | Norman | 2
6 | Kelsie | Hays | 3
7 | Tory | Goff | 3
8 | Salley | Lester | 3
我自己离开加入了,结果是预期的。
SELECT
e.first_name || ' ' || e.last_name AS employee,
m.first_name || ' ' || m.last_name AS manager
FROM
employee e
LEFT JOIN employee m ON m.employee_id = e.manager_id;
employee | manager
-----------------+-----------------
Windy Hays |
Ava Christensen | Windy Hays
Hassan Conner | Windy Hays
Anna Reeves | Ava Christensen
Sau Norman | Ava Christensen
Kelsie Hays | Hassan Conner
Tory Goff | Hassan Conner
Salley Lester | Hassan Conner
(8 rows)
但是这个查询给了我
SELECT
e.first_name || ' ' || e.last_name AS employee,
m.first_name || ' ' || m.last_name AS manager
FROM
employee e
LEFT JOIN employee m ON m.employee_id = e.manager_id;
WHERE m.employee_id IS NULL;
employee | manager
------------+---------
Windy Hays |
(1 row)
所以我不明白为什么它 returns 不是什么都不是。employee_id 永远不会是 NULL...
employee_id will never be a NULL...
null
值来自第 e.manager_id
列(不是第 m.employee_id
列)- 那是 Windy Hays,层次结构树中的顶级员工。
对于此特定行,尝试检索相应管理器的 left join
未找到匹配项 - 因此现在 m.employee_id
在结果集中为 null
。
也许您想写的 where
子句是:
WHERE e.employee_id IS NULL
...确实 return 没有行,正如人们所期望的那样。
您正在 left join
从 e
到 m
。
当没有匹配的时候,那么left join
还是returns一行。该行中 m
的值是多少?他们是 NULL
.
约定俗成SQL用NULL
表示“外连接缺失匹配”(但实际上没有替代值)。
因此,Wendy Hayes 行中 m
m 的 所有 列将是 NULL
。
这就是我的 employee
table 的样子 其中 manager_id
是同一个 table 的外键,它引用 employee_id
并指示哪个员工有经理,谁是。
employee_id | first_name | last_name | manager_id
-------------+------------+-------------+------------
1 | Windy | Hays |
2 | Ava | Christensen | 1
3 | Hassan | Conner | 1
4 | Anna | Reeves | 2
5 | Sau | Norman | 2
6 | Kelsie | Hays | 3
7 | Tory | Goff | 3
8 | Salley | Lester | 3
我自己离开加入了,结果是预期的。
SELECT
e.first_name || ' ' || e.last_name AS employee,
m.first_name || ' ' || m.last_name AS manager
FROM
employee e
LEFT JOIN employee m ON m.employee_id = e.manager_id;
employee | manager
-----------------+-----------------
Windy Hays |
Ava Christensen | Windy Hays
Hassan Conner | Windy Hays
Anna Reeves | Ava Christensen
Sau Norman | Ava Christensen
Kelsie Hays | Hassan Conner
Tory Goff | Hassan Conner
Salley Lester | Hassan Conner
(8 rows)
但是这个查询给了我
SELECT
e.first_name || ' ' || e.last_name AS employee,
m.first_name || ' ' || m.last_name AS manager
FROM
employee e
LEFT JOIN employee m ON m.employee_id = e.manager_id;
WHERE m.employee_id IS NULL;
employee | manager
------------+---------
Windy Hays |
(1 row)
所以我不明白为什么它 returns 不是什么都不是。employee_id 永远不会是 NULL...
employee_id will never be a NULL...
null
值来自第 e.manager_id
列(不是第 m.employee_id
列)- 那是 Windy Hays,层次结构树中的顶级员工。
对于此特定行,尝试检索相应管理器的 left join
未找到匹配项 - 因此现在 m.employee_id
在结果集中为 null
。
也许您想写的 where
子句是:
WHERE e.employee_id IS NULL
...确实 return 没有行,正如人们所期望的那样。
您正在 left join
从 e
到 m
。
当没有匹配的时候,那么left join
还是returns一行。该行中 m
的值是多少?他们是 NULL
.
约定俗成SQL用NULL
表示“外连接缺失匹配”(但实际上没有替代值)。
因此,Wendy Hayes 行中 m
m 的 所有 列将是 NULL
。