我碰巧遇到了以下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的所有不同日期。为什么会这样?
答案 0 :(得分:3)
不要认为递归CTE实际上是“递归的”。它们是归纳的。
CTE的锚部分运行。然后“递归”部分继续添加行 - 基于最近添加的行。因此,第一次迭代添加第一个日期。第二次迭代采用刚刚添加的日期并添加一个日期。
第三次迭代只考虑第二次(最后)日期,而不是两者。
术语不是很好,但它们不会通过多次重新处理给定行来生成重复项。
答案 1 :(得分:0)
DECLARE @SDate DATETIME
SET @SDate = '2011-9-01 00:00:00.000'
select @SDate;
select @SDate + 1;