1

我正在使用 Postgres 9.1,并且我有一个带有家谱层次结构的表。此表称为父母,其中有两个外键,一个用于父级,一个用于关系中的子级。以下 SQL 查询(大部分是从 Postgres 文档中窃取的)可以工作,但会向上和向下遍历树:

with recursive temp(child, parent, depth, path, cycle) as
        (select child, parent, 1, array[child], false
         from parents
         where parent = 149

         union all

         select parents.child, parents.parent, temp.depth + 1, path || parents.child, parents.child = any(path)
         from temp, parents
         where parents.child = temp.parent)
    select distinct c1.name as child_name, c2.name as parent_name
    from temp
    join people c1 on temp.child = c1.id
    join people c2 on temp.parent = c2.id;

父节点 149 是遍历的根节点。

输出有 149 个子代和所有代的祖先。理想情况下,查询将沿家谱下降,并且没有祖先的代。

4

1 回答 1

1

免责声明:在我意识到@wildplasser已经在他们对该问题的评论中提出了相同的建议之前,这个答案被接受了。(不是想盗用别人的想法,抱歉。)

如果您只想构建从给定父代的后代,则应更改此条件

parents.child = temp.parent

对此

temp.child = parents.parent

因为在下一次迭代temp中应该将孩子视为父母(即匹配)。parents.parent

于 2012-07-11T14:07:38.520 回答