我有一个包含两列的表:child
和parent
。该表表示具有多个树的树类型结构。给任何孩子,我需要找到它的根源。换句话说,我需要先获得那个孩子的父母,再得到那个父母的父母,依此类推,直到到达那个孩子的根。
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中??
答案 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;