sql - 简单的 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...
解决方案
employee_id 永远不会是 NULL...
该null
值来自 column e.manager_id
(而不是 column m.employee_id
)-即 Windy Hays,分层树中的顶级员工。
对于这个特定的行,left join
尝试检索相应管理器的 没有找到匹配项 - 所以现在m.employee_id
在null
结果集中。
也许where
你想写的条款是:
WHERE e.employee_id IS NULL
...正如人们所期望的那样,这确实不会返回任何行。
推荐阅读
- r - 具有线性和 log10 轴的表达式图
- ruby - 按帖子数量对 Jekyll 标签进行排序
- javascript - Django 动态添加表单 - 'NoneType' 和 'int' 的实例之间不支持'<'
- html - Angular EventEmitter 获取数据
- angular - 如何在 Angular 中以编程方式设置 ngModel 绑定?
- c++ - C++:当用户输入错误时获得循环的最佳实践
- scala - 使用 value* 扩展方法时如何解决“尝试了扩展方法,但无法完全构造”?
- jsp - 如何使用 JSTL c:forEach 将 2 列表呈现为 4 列表
- reactjs - 包裹元素时可以删除 MUI 网格间距吗?
- macos - 如何使用 brew 安装旧版本的 ocaml?