【问题标题】:Why does a recursive cte not return duplicates?为什么递归 cte 不返回重复项?
【发布时间】:2018-08-05 05:48:53
【问题描述】:

碰巧遇到下面的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 月 1 日到 2011 年 10 月 1 日的所有不同日期。为什么会这样?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      你测试了吗?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 2016-02-01
        • 2014-04-22
        • 2017-11-07
        相关资源
        最近更新 更多