繁体   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