[英]Simple PostgreSQL Self Join
這就是我的employee
表的樣子,其中manager_id
是它引用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)
所以我不明白為什么它會返回一些東西而不是什么都沒有。 employee_id永遠不會是 NULL...
employee_id 永遠不會是 NULL...
null
值來自e.manager_id
列(而不是m.employee_id
列) - 這是 Windy Hays,層次樹中的頂級員工。
對於這個特定的行,嘗試檢索相應經理的left join
沒有找到匹配項 - 所以現在m.employee_id
在結果集中是null
。
也許你想寫的where
子句是:
WHERE e.employee_id IS NULL
...正如人們所期望的那樣,這確實不會返回任何行。
您正在從e
到m
進行left join
。
當沒有匹配時, left join
仍然返回一行。 行中m
的值是多少? 它們是NULL
。
約定 SQL 使用NULL
來表示“外連接中的缺失匹配”(但實際上沒有替代值)。
因此,Wendy Hayes 的行中m
的所有列都是NULL
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.