简单的 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...

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

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 joinem

当没有匹配的时候,那么left join还是returns一行。该行中 m 的值是多少?他们是 NULL.

约定俗成SQL用NULL表示“外连接缺失匹配”(但实际上没有替代值)。

因此,Wendy Hayes 行中 mm 的 所有 列将是 NULL