为什么递归 SQL "range" 查询中没有重复项?
Why aren't there duplicates in a recursive SQL "range" query?
供参考,这里是:
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
对 table 的所有行进行了 n+1(其中有两行),然后执行了 UNION ALL
,这不会删除重复项。为了更清楚地说明这一点:
迭代 4
- 1
- 2
- 2
- 3
- 2
- 3
- 3
- 4
在递归查询的上下文中,UNION ALL
真的意味着 UNION
吗?还是我遗漏了一些关于递归查询的更基本的东西?
正如所讨论的那样here每次递归执行的输入只是上一级的结果,而不是到目前为止的累积结果。
锚点级别发出 1。运行 上的递归部分产生 2。运行 2 上的递归部分产生 3,依此类推。
供参考,这里是:
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
对 table 的所有行进行了 n+1(其中有两行),然后执行了 UNION ALL
,这不会删除重复项。为了更清楚地说明这一点:
迭代 4
- 1
- 2
- 2
- 3
- 2
- 3
- 3
- 4
在递归查询的上下文中,UNION ALL
真的意味着 UNION
吗?还是我遗漏了一些关于递归查询的更基本的东西?
正如所讨论的那样here每次递归执行的输入只是上一级的结果,而不是到目前为止的累积结果。
锚点级别发出 1。运行 上的递归部分产生 2。运行 2 上的递归部分产生 3,依此类推。