在 Postgres 中查找树的根节点

Finding the root node of a tree in Postgress

我正在使用 PostgreSQL,我在 table 中有这样的数据。

id    parent_id
1      NULL
2      1
3      2
4      NULL
5      4

我想得到以下结果。

id.   root_id
1      NULL
2      1
3      1
4      NULL
5      4

也就是说,对于每个 id,我都想向上添加父节点,直到找到一个没有父节点的父节点 - 可以说是最终祖先。

非常感谢一些 SQL-fu 解决了这个问题。

谢谢!

你应该从根开始,让树走向叶子:

with recursive my_tree as (
    select id, parent_id, id as root
    from my_table 
    where parent_id is null
union all
    select m.id, m.parent_id, t.root
    from my_table m
    join my_tree t on t.id = m.parent_id
) 
select id, root
from my_tree
order by id;

注意根据定义(没有父节点的节点是根),节点1的根是1,不是null。

db<>fiddle.

中测试