如何像树一样遍历表中的行

时间:2019-05-03 06:50:57

标签: postgresql hierarchical-data recursive-query

我有一个包含两列的表:childparent。该表表示具有多个树的树类型结构。给任何孩子,我需要找到它的根源。换句话说,我需要先获得那个孩子的父母,再得到那个父母的父母,依此类推,直到到达那个孩子的根。

child    parent
1        2
2        3
9        10
3        4
4        5
5        255

在这里,我们有两棵树。一个从255(根)开始,到1(叶)结束。 255 -> 5 -> 4 -> 3 -> 2 -> 1。第二个从10开始到9结束。例如:如果给定3,则需要找到根,在这种情况下为255。 我真的是SQL世界的新手。我的想法是递归地遍历子级的parent列,直到途中某个父级的child列中没有条目并返回该父级为止。有没有一种方法可以在SQL中做到这一点,尤其是在postgres中??

1 个答案:

答案 0 :(得分:1)

在这种情况下,可以使用递归查询。唯一的问题是递归查询在Postgres中不是很有效,因此您只能将这种方法用于少量数据。 继承人示例:

create table tree (id integer, parent integer);
insert into tree values(1, null);
insert into tree values(2, 1);
insert into tree values(3, 1);
insert into tree values(4, 3);
insert into tree values(5, 2);

insert into tree values(10, null);
insert into tree values(20, 10);
insert into tree values(30, 10);
insert into tree values(40, 30);
insert into tree values(50, 20);

with recursive parentsearch as (
 select id, parent as parent_id from tree where id = :leaf_id
 union
 select t.id, t.parent as parent_id from tree t join parentsearch ps on t.id=ps.parent_id
)
select * from parentsearch where parent_id is null;