Postgres - SQL 递归以获得最高父级

问题描述 投票:0回答:1

我需要一些帮助来创建具有递归性的 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 罗塞特

有人可以帮助我吗?预先感谢。

sql postgresql recursion
1个回答
0
投票

您可以将递归 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 处的运行示例。

© www.soinside.com 2019 - 2024. All rights reserved.