为什么这个CTE像柜台一样?

时间:2019-01-23 18:56:34

标签: sql tsql sql-server-2014

以下查询的行为与我对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

为什么?

3 个答案:

答案 0 :(得分:3)

CTE本质上是可以引用自身的可重用子查询,因此您的最终查询等同于:

const bar = foo ? 'foo' as Status : 'bar';

直到SELECT 1 UNION ALL (SELECT 2 UNION ALL (SELECT 3 ... 达到10。

答案 1 :(得分:3)

select 1,可能不会打扰您。结果为1

对CTE中的所有 new 行重复执行递归查询select n + 1 from cte where n<10,直到没有新行产生(或达到MaxRecursion限制)为止。

唯一的新行中的第一次是从锚点开始1,结果是2n + 1)。现在有一个新行:2。结果:3。泡沫,冲洗,重复直到n<10不会产生新行。

答案 2 :(得分:0)

尝试一下。

with cte (n) as
(
    select 1
    union all
    select n + 1 from cte where n<10

    union all
    select n + 1 from cte where n<2
)
select top (10*2-2) * from cte order by n