簡體   English   中英

簡單 PostgreSQL 自聯接

[英]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...

http://sqlfiddle.com/#!17/6e6af/9

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

...正如人們所期望的那樣,這確實不會返回任何行。

您正在從em進行left join

當沒有匹配時, left join仍然返回一行。 行中m的值是多少? 它們是NULL

約定 SQL 使用NULL來表示“外連接中的缺失匹配”(但實際上沒有替代值)。

因此,Wendy Hayes 的行中m所有列都是NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM