我有一个表格,其列如下所示
| Employee ID | Manager ID |
|:-----------:|:----------:|
| E068 | E067 |
| E071 | E067 |
| E229 | E069 |
| E248 | E144 |
| E226 | E223 |
| E236 | E241 |
| E066 | E001 |
| E067 | E001 |
| E144 | E001 |
| E223 | E001 |
| E001 | Null |
| E241 | Null |
我们确实有包含“领导者 ID”的表
| Leader ID |
|-----------|
| E001 |
| E241 |
问题陈述:
此问题是通过使用员工及其经理数据来识别经理主管。
关于:我们有一个员工 ID 和他们的经理 ID。请注意,经理 ID 来自员工 ID。由于每个经理都有一位高于其级别的经理。
首先,我们将获取 Manager ID 列中的所有唯一 ID。
然后对于 Manager ID 列中的每个 ID,我们将查找其各自的 Manager ID(Manager)
然后我们将创建一个新的列名称Leader它将包含 Manager 的所有层次结构。
所需输出:
| Employee ID | Manager ID | Leader ID |
|-------------|-------------|-----------|
| E068 | E067 | E001 |
| E071 | E067 | E001 |
| E229 | E069 | E001 |
| E248 | E144 | E001 |
| E226 | E223 | E001 |
| E236 | E241 | E241 |
| E066 | E001 | E001 |
| E067 | E001 | E001 |
| E144 | E001 | E001 |
| E223 | E001 | E001 |
员工 ID 列包含唯一 ID,而经理 ID 包含重复 ID。
这是一个典型的例子与递归 https://www.postgresql.org/docs/current/queries-with.html
使用 RECURSIVE,WITH 查询可以引用其自己的输出。
尝试这个:
with recursive subordinates as
(select
employeid,
e.managerid,
e.managerid as leader
from employes e
where e.managerid in(select * from leaders) -- non recursive term
union
select
e.employeid,
e.managerid,
a.managerid as leader
from employes e
join subordinates a on a.employeid = e.managerid -- recursive term
) select * from subordinates
如文档中所述:
A 与递归总是由
- 非递归术语
-
UNION or 联合所有
- 一个递归术语,唯一可以引用查询输出的
当前一次迭代没有输出时,递归终止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)