为什么这个 CTE 就像一个计数器?
Why does this CTE act like a counter?
以下查询的行为与我对 CTE 的理解不同,有人可以详细说明为什么会这样吗?
with cte (n) as
(
select 1
union all
select n + 1 from cte where n<10
)
select * from cte
我期待以下输出:
1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10
但我得到:
1,2,3,4,5,6,7,8,9,10
为什么?
CTE 基本上是一个可以引用自身的可重用子查询,因此您的最终查询等同于:
SELECT 1
UNION ALL (SELECT 2
UNION ALL (SELECT 3 ...
直到 n
达到 10。
主播、select 1
可能不会打扰你。结果是 1
.
递归查询 select n + 1 from cte where n<10
对 CTE 中的所有 new 行重复执行,直到没有新行生成(或直到 MaxRecursion
达到上限)。
第一次通过唯一的新行是来自锚点的 1
,结果是 2
(n + 1
)。现在有一个新行:2
。结果:3
。起泡、冲洗、重复,直到 n<10
不再生成新行。
以下查询的行为与我对 CTE 的理解不同,有人可以详细说明为什么会这样吗?
with cte (n) as
(
select 1
union all
select n + 1 from cte where n<10
)
select * from cte
我期待以下输出:
1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10
但我得到:
1,2,3,4,5,6,7,8,9,10
为什么?
CTE 基本上是一个可以引用自身的可重用子查询,因此您的最终查询等同于:
SELECT 1
UNION ALL (SELECT 2
UNION ALL (SELECT 3 ...
直到 n
达到 10。
主播、select 1
可能不会打扰你。结果是 1
.
递归查询 select n + 1 from cte where n<10
对 CTE 中的所有 new 行重复执行,直到没有新行生成(或直到 MaxRecursion
达到上限)。
第一次通过唯一的新行是来自锚点的 1
,结果是 2
(n + 1
)。现在有一个新行:2
。结果:3
。起泡、冲洗、重复,直到 n<10
不再生成新行。