为什么递归cte不返回重复?

时间:2018-02-25 18:54:36

标签: sql-server tsql recursion common-table-expression

我碰巧遇到了以下sql语句

DECLARE @SDate DATETIME
DECLARE @TDate DATETIME
SET @SDate = '2011-9-01 00:00:00.000'
SET @TDate = '2011-10-01 00:00:00.000'
;WITH CTE AS
(
    SELECT @SDate Date
    UNION ALL
    SELECT Date + 1 FROM CTE WHERE Date + 1 <= @TDate
)
SELECT Date FROM CTE

据我所知,这个语句应该返回很多重复项,因为递归中的每次迭代都会将整个列递增1,结果应该是所有中间表的UNION ALL。

但令我惊讶的是,结果表中没有重复项,只包含2011-9-01至2011-10-01的所有不同日期。为什么会这样?

2 个答案:

答案 0 :(得分:3)

不要认为递归CTE实际上是“递归的”。它们是归纳的。

CTE的锚部分运行。然后“递归”部分继续添加行 - 基于最近添加的行。因此,第一次迭代添加第一个日期。第二次迭代采用刚刚添加的日期并添加一个日期。

第三次迭代只考虑第二次(最后)日期,而不是两者。

术语不是很好,但它们不会通过多次重新处理给定行来生成重复项。

答案 1 :(得分:0)

你试过这个吗?

DECLARE @SDate DATETIME
SET @SDate = '2011-9-01 00:00:00.000'
select @SDate; 
select @SDate + 1;
相关问题