首页 > 解决方案 > 简单的 PostgreSQL 自联接

问题描述

这就是我的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

标签: sqlpostgresqlleft-joinself-join

解决方案


employee_id 永远不会是 NULL...

null值来自 column e.manager_id(而不是 column m.employee_id)-即 Windy Hays,分层树中的顶级员工。

对于这个特定的行,left join尝试检索相应管理器的 没有找到匹配项 - 所以现在m.employee_idnull结果集中。

也许where你想写的条款是:

WHERE e.employee_id IS NULL

...正如人们所期望的那样,这确实不会返回任何行。


推荐阅读