为什么在递归SQL“范围”查询中没有重复项?

问题描述 投票:1回答:1

供参考,这里是:

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 n + 1,所以执行了UNION ALL,该操作不会删除重复项。为了更清楚一点:

迭代4

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

UNION ALL在递归查询的上下文中真的意味着UNION吗?还是我缺少关于递归查询的更基本的内容?

sql recursion common-table-expression recursive-query
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.