我使用的是 Postgres 9.1,我有一张表,里面有家谱层次结构。这张表称为 parent ,其中有两个外键,一个用于关系中的父项,一个用于子项。下面的 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 的一代 child 和所有世代的祖先。理想情况下,查询将沿着家谱下降并且没有祖先的世代。
最佳答案
免责声明:这个答案在我意识到 @wildplasser 之前就被接受了有already suggested他们对问题的评论也是如此。 (不是要盗用别人的想法,抱歉。)
如果你只想构建给定父代的后代,你应该改变这个条件
parents.child = temp.parent
对此
temp.child = parents.parent
因为在下一次迭代中应该将 temp
子级视为父级(即与 parents.parent
匹配)。
关于sql - CTE SQL查询在两个方向上递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11429035/