Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Sql 如何在使用外键引用自身的表中提取根元素?(循环?)_Sql_Postgresql_Loops - Fatal编程技术网

Sql 如何在使用外键引用自身的表中提取根元素?(循环?)

Sql 如何在使用外键引用自身的表中提取根元素?(循环?),sql,postgresql,loops,Sql,Postgresql,Loops,例如,假设您有一个像这样的人: Id Name Birthdate Parent 1 Hans 1960/10/15 null 2 Svend 1985/01/23 1 3 Peter 2004/03/02 2 Parent是Person表上的外键。 我想一路回到最年长的父母身边,从一个孩子开始。 例如,从Peter开始,是否可以在SQL中检索Hans 在起始行和结束行之间可能有几十个中间行。递归CTE(递归公共表表达式)将执行您想要的操作: wit

例如,假设您有一个像这样的人:

Id  Name    Birthdate   Parent
1   Hans    1960/10/15  null
2   Svend   1985/01/23  1
3   Peter   2004/03/02  2
Parent是Person表上的外键。
我想一路回到最年长的父母身边,从一个孩子开始。 例如,从Peter开始,是否可以在SQL中检索Hans

在起始行和结束行之间可能有几十个中间行。

递归CTE(递归公共表表达式)将执行您想要的操作:

with recursive
x as (
  select *, 1 as my_level from my_table where id = 3 -- Peter's id
  union all
  select
    t.*, x.my_level + 1
  from my_table t
  join x on x.parent = t.id
)
select * from x order by my_level desc limit 1

我删除了不兼容的数据库标记。请标记您真正使用的数据库。是的,这是可能的。尝试使用递归方法。