sql - CTE SQL查询在两个方向上递归

标签 sql postgresql common-table-expression postgresql-9.1

我使用的是 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/

相关文章:

sql - 尽管使用 CAST 还是转换错误?

sql - 在SQL中透视日期参数以实现WOW增长

postgresql - 无法在 etc centos 中找到 postgresql

sql-server - INSERT INTO SELECT 给出 : Column name or number of supplied values does not match table definition

sql - CTE - 使用更新的记录和 upsert 语句

php - 将 sql 与当前登录用户相加

mysql - 什么时候用sql,什么时候用存储过程?

postgresql - 如何通过 DirectFunctionCall 发送 NULL 参数?

mysql - 使用 knex 和 bookshelf 创建数据库和模式的语法?

ruby-on-rails - 使用 Ruby on Rails 的 Postgres 公用表表达式查询