首页 > 解决方案 > Postgres 获取自引用表的根

问题描述

给定表格:

CREATE TABLE self-ref (
  name VARCHAR NOT NULL,
  parent VARCHAR REFERENCES self-ref(name),

  PRIMARY KEY(name)
);

如果我从表中获得一个名称(因此是 Pkey),我如何获得它的“根”级父级的名称:父级为 NULL 的名称,由给定名称(间接)引用。

假设我有这些值(我不知道我会得到哪些值):

+-------------+-----------+
| Name        | Parent    |
+-------------+-----------+
| Root 1      | NULL      |
| Root 2      | NULL      |
| Child 1     | Root 1    |
| Child 2     | Root 2    |
| Sub-child 1 | Child 1   |
+-------------+-----------+

函数/任何解决方案都应该为Root 1Child 1Sub-child 1返回Root 1 ;并且应该为Root 2Child 2返回Root 2 。

我怎样才能做到这一点? 注意:它真的必须是 Postgres....

标签: sqlpostgresql

解决方案


您需要递归 CTE。语法如下:

with recursive cte as (
      select name, name as parent
      from selfref
      where parent is null
      union all
      select s.name, cte.parent
      from cte join
           selfref s
           on s.parent = cte.name
     )
select *
from cte;

是一个 db<>fiddle。


推荐阅读