Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgres中的递归SQL查询_Sql_Postgresql_Recursive Query - Fatal编程技术网

Postgres中的递归SQL查询

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 非常感谢 您可以通过生成所有祖先,然后过滤掉它们来实

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

非常感谢

您可以通过生成所有祖先,然后过滤掉它们来实现这一点。以下是您的数据示例:

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;