【问题标题】:Why aren't there duplicates in a recursive SQL "range" query?为什么递归 SQL“范围”查询中没有重复项?
【发布时间】:2020-06-25 04:10:23
【问题描述】:

供参考,这里是:

WITH range_10 AS (
  SELECT 1 AS n
           UNION ALL
  SELECT n+1 AS n
    FROM range_10
   WHERE n < 10
)
SELECT * FROM range_10;

正如我们都知道和喜爱的那样,这会生成一列 n,其值从 1 到 10。但是,我对为什么输出中没有 n 的重复值感到困惑。以下是我对如何执行此查询的理解:

迭代 1

range_10 开始为空

range_10 结束为:

  • 1

迭代 2

range_10 结束为:

  • 1
  • 2

迭代 3

range_10 结束为:

  • 1
  • 2
  • 2
  • 3

为什么?因为我们SELECT'ed n+1 为表的所有行(其中有两个),然后做了一个UNION ALL,它不会删除重复项。为了更清楚地说明这一点:

迭代 4

  • 1
  • 2
  • 2
  • 3
  • 2
  • 3
  • 3
  • 4

在递归查询的上下文中,UNION ALL 真的意味着UNION 吗?还是我错过了一些关于递归查询的更基本的东西?

【问题讨论】:

标签: sql recursion common-table-expression recursive-query


【解决方案1】:

正如here 所讨论的,每次递归执行的输入只是上一级的结果,而不是到目前为止的累积结果。

锚级别发出 1。在其上运行递归部分会产生 2。在 2 上运行递归部分会产生 3,依此类推。

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2020-07-05
    • 1970-01-01
    • 2018-08-05
    • 2020-07-28
    相关资源
    最近更新 更多