sql - SQL 中带有停止条件的递归 SELECT?

标签 sql postgresql recursion recursive-query

我的名为 element 的表格如下所示:

 id | successor | important
----------------------------
  1 | NULL      | 0
  2 | 4         | 1
  3 | 5         | 0
  4 | 8         | 0
  5 | 6         | 1
  6 | 7         | 0
  7 | NULL      | 0
  8 | 10        | 1
  9 | 10        | 0
 10 | NULL      | 0

我从一个元素的 ID 开始。每个元素可能有也可能没有后续元素。因此,给定任何元素 ID,我可以从 0..n 个元素构建一个元素链,具体取决于它的后继者和后继者-后继者,等等。

假设我的起始 ID 是 2。这导致以下链:

2 -> 4 -> 8 -> 10

现在我想问这个问题:一个特定的元素链是否至少包含一个重要== 1的元素?

在伪代码中,一个函数在没有不必要的检查的情况下实现它可能看起来像这样:

boolean chainIsImportant(element)
{
    if (element.important == 1) {
        return true;
    }

    if (element.successor != NULL) {
        return chainIsImportant(element.successor);
    }

    return false;
}

我想这可以用 WITH RECURSIVE 来实现,对吧?一旦找到具有 important == 1 的元素,如何停止递归?

最佳答案

这通常是通过聚合有问题的列并在 CTE 的递归部分添加连接条件来完成的:

with recursive all_elements as (
  select id, successor, important, array[important] as important_elements
  from elements
  where successor is null
  union all
  select c.id, c.successor, c.important, p.important_elements||c.important
  from elements c
     join all_elements p on c.successor = p.id
  where 1 <> all(p.important_elements)
)
select *
from all_elements;

请注意条件是“翻转”的,因为 where 子句定义了那些应该包含的行。

关于sql - SQL 中带有停止条件的递归 SELECT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878504/

相关文章:

Javascript匿名函数错误

c# - SQL 数据库 : search more than one column

postgresql - Postgres 递归 json 限制

php - 如何计算foreach循环递归中的行?

Postgresql: "public."是在 Postgresql 中完全限定表名的标准方法吗?

sql - postgres 中使用命令复制的变量串联问题

java - 递归函数缺少返回语句

用于按组和总计数获取计数的mysql查询

Mysql根据同一张表中的多行选择行

mysql - 是否可以通过查看执行计划来了解为什么我的查询如此缓慢