Postgres中的递归SQL查询
Scema: 示例表:Postgres中的递归SQL查询,sql,postgresql,recursive-query,Sql,Postgresql,Recursive Query,Scema: 示例表: Person(pid:int, name:char(20), predecessor:int -> Person.pid ) 如何找到一个人“abc”的所有继任者 所需输出: pid, name, predecessor 0, 'abc', NULL 1, 'bcd', 0 2, 'cde', 1 3, 'efg', NULL 4, 'fgh', 3 非常感谢 您可以通过生成所有祖先,然后过滤掉它们来实
Person(pid:int,
name:char(20),
predecessor:int -> Person.pid
)
如何找到一个人“abc”的所有继任者
所需输出:
pid, name, predecessor
0, 'abc', NULL
1, 'bcd', 0
2, 'cde', 1
3, 'efg', NULL
4, 'fgh', 3
非常感谢 您可以通过生成所有祖先,然后过滤掉它们来实现这一点。以下是您的数据示例:
name
'bcd'
'cde'
是一个SQL FIDLE。只需在一个:
旁白:请编辑问题,提供样本数据和所需结果。检查手册。它有这样的例子:
with recursive cte(pid, lev, ancestor) as (
select pid, 0, predecessor
from person p
union all
select cte.pid, lev + 1, p.predecessor
from person p join
cte
on p.pid = cte.ancestor
)
select p2.name
from cte join
person p1
on cte.ancestor = p1.pid join
person p2
on cte.pid = p2.pid
where p1.name = 'abc';
with recursive cte as (
select p.pid, p.name, 1 AS lvl
from person a
join person p ON p.predecessor = a.pid
where a.name = 'abc'
union all
select p.pid, p.name, c.lvl + 1
from cte c
join person p ON p.predecessor = c.pid
)
select name
from cte
order by lvl;