为什么这个 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 不再生成新行。