以下查询的行为与我对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
为什么?
答案 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
,结果是2
(n + 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