sql - 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 1、Child 1和Sub-child 1返回Root 1 ;并且应该为Root 2和Child 2返回Root 2 。
我怎样才能做到这一点? 注意:它真的必须是 Postgres....
解决方案
您需要递归 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。
推荐阅读
- dart - 强制堆栈重新创建自定义小部件
- plotly - 调整两个 x 轴值之间的距离,使其彼此更接近
- reactjs - React Bootstrap - 如何在 FormControl 属性和选项标签中呈现组件?
- image - Apostrophe CMS 无法在 JS beforeSave 中获取图像,但可以在 HTML 模板中获取图像
- javascript - 如何避免在 Firefox 中刷新页面?它在 Firefox 中不起作用
- javascript - 有没有更短的方法来编写这个脚本?
- angular - 角度分量中来自剑道网格的服务器端参数
- php - PHP在空白处插入数据
- ios - 当我们不创建正在读取的地址时,如何在 iOS 上解决“EXC_BAD_ACCESS”
- java - 添加空处理器时,Kafka Streams 处理速度变慢