Postgresql 如何以树的形式遍历表中的行

Postgresql 如何以树的形式遍历表中的行,postgresql,hierarchical-data,recursive-query,Postgresql,Hierarchical Data,Recursive Query,我有一个包含两列的表: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点

我有一个包含两列的表:
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中,有没有办法做到这一点?

对于这种情况,可以使用递归查询。唯一的问题是递归查询在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;

不相关,但是:使用像255这样的“幻数”来表示没有父母是个坏主意。你应该存储空而不是空。非常感谢。只是OOC,如果没有给出孩子身份,那么你会如何找出所有的树组合(根叶)?首先,你需要考虑这是很容易找到根(因为他们的父母从来没有被用作儿童ID [或ID在我的样本])为简单起见,我会认为它总是空的。因此,您只需从每个已知根开始遍历树中所有可能的路径。在PG中,可以将遍历的路径保留在数组类型中。然后你必须过滤结果,只找到那些以树中最后一片叶子结尾的结果——只需检查给定的child_id是否从未用作父项即可。所以最后你会在这把小提琴中得到类似的东西: