有人可以解释结果如何到来? - CTE SQL Server

时间:2012-02-13 17:47:21

标签: sql-server sql-server-2008 sql-server-2005 common-table-expression

with CTE(x) as (
   select x = 1 
   union all 
   select X=X+1 from CTE where x < 4 
   union all 
   select X=X+1 from CTE where x < 4
)
select x from CTE 
GO  

结果将是。 。

x
1
2
2
3
3
4
4
4
4
3
3
4
4
4
4

3 个答案:

答案 0 :(得分:1)

select x = 1

被称为锚元素。它是递归调用的基础(正如Alex K.指出这是一个递归CTE)。

2两个来自递归成员

select X=X+1 from CTE where x < 4 
union all 
select X=X+1 from CTE where x < 4

在锚点上被调用1.四个3来自于在两个2上被调用的递归成员,最后8个四个来自在4个三个上调用的递归成员。

然后由于条件而停止

x < 4

答案 1 :(得分:1)

如果你只是一点一点地完成它很容易......

首先你有一个。

然后,1从UNIONs创建两个2,给出1,2 *,2 *(星号表示尚未处理的元素)。

然后处理2中的一个以给出1,2 *,2,3 *,3 *。请注意,我处理的下一个是最近的未处理元素。这使得它首先采用深度而不是广度优先。该系列然后沿着这些方向扩展:

1
1,2*,2*
1,2*,2,3*,3*
1,2*,2,3*,3,4,4
1,2*,2,3,3,4,4,4,4
1,2,2,3,3,4,4,4,4,3*,3*
1,2,2,3,3,4,4,4,4,3*,3,4,4
1,2,2,3,3,4,4,4,4,3,3,4,4,4,4

Fours永远不需要处理,所以不要*标记。

答案 2 :(得分:0)

选择1。

取选定值(1),加1并将其与所选值加1合并。(2,2)

刚刚添加两行(2,2)并重复。 (3,3)

...

“四是出局。”