我需要一些帮助来创建具有递归性的 SQL 查询 (POSTGRES)。 来解释一下吧。
这是我名为“employe”的表的一部分。
id string
nom string
manager string (reference the column id)
这是一个快照 这是表“employe”的快照
身份证 | 诺姆 | 经理 |
---|---|---|
1 | 马丁 | |
2 | 杜兰特 | 1 |
3 | 市场 | 2 |
4 | 本·哈法 | |
5 | 卡斯特 | 4 |
6 | 卡利斯坎 | |
7 | 比森 | 6 |
8 | 维拉蒂 | 7 |
9 | 巴鲁佐 | 8 |
10 | 罗塞特 |
我想要的是为每个“员工”提取层次结构中的最高管理者。
我试图通过使用递归来做到这一点。这就是我尝试的:
WITH RECURSIVE q AS
(
SELECT m
FROM employe m
WHERE id = '9'
UNION ALL
SELECT m
FROM q
JOIN employe m
ON m.id = q.manager
)
SELECT (m).*
FROM q
WHERE (m).manager IS NULL
但是它不起作用...
这是我尝试做的一个例子:
身份证 | 诺姆 | 最高_经理 |
---|---|---|
1 | 马丁 | |
2 | 杜兰特 | 1 |
3 | 市场 | 1 |
4 | 本哈法 | |
5 | 卡斯特 | 4 |
6 | 卡利斯坎 | |
7 | 比松 | 6 |
8 | 维拉蒂 | 6 |
9 | 巴鲁佐 | 6 |
10 | 罗塞特 |
有人可以帮助我吗?预先感谢。
您可以将递归 CTE 与
DISTINCT ON
子句结合起来以获得最高父级,如下所示:
with recursive
n as (
select id, nom, manager, 0 as lvl from employee
union all
select n.id, n.nom, m.manager, n.lvl + 1
from n
join employee m on m.id = n.manager and m.manager is not null
)
select distinct on (id) *
from n
order by id, lvl desc
结果:
id nom manager lvl
--- ---------- -------- ---
1 MARTIN null 0
2 DURANT 1 0
3 MARQUET 1 1
4 BEN HARFA null 0
5 CASTEL 4 0
6 CALISKAN null 0
7 BISSON 6 0
8 VERRATI 6 1
9 BALUZO 6 2
10 ROUSSET null 0
请参阅 db<>fiddle 处的运行示例。