0

此查询返回使用变量定义的日期范围之间的所有天数,结果集是 31 个不同的值。但是,递归 CTE 的工作方式是第一个查询只执行一次,第二个查询对之前创建的结果集起作用。因此,似乎会有重复,但它返回了不同的结果集。CTE 是在内部应用 DISTINCT 子句还是其他什么?我如何获得 DISTINCT 值?

DECLARE 
    @DateFrom DATE = '20130101' ,
    @DateTo DATE = '20130131'

WITH Days
AS ( SELECT CAST(@DateFrom AS DATETIME) AS dt
     UNION ALL
     SELECT DATEADD(dd, 1, dt)
     FROM Days s
     WHERE DATEADD(dd, 1, dt) <= CAST(@DateTo AS DATETIME)
   )

SELECT dt 
FROM Days
4

1 回答 1

1

每次 CTE 递归时,它都会使用前一次递归产生的行(如果这是它第一次递归,则使用初始行集)。

因此,对于您的查询,第一次运行会产生一行 -'20130101'转换为日期时间。

对于第一个递归步骤,我们获取最后一次递归或初始集合 ( '20130101') 生成的所有行,并使用它来生成一个新行,其中包含'20130102'.

对于下一个递归步骤,我们将最后一次递归产生的所有行 ( '20130102') 并使用它来产生一个新行 ( '20130103')

对于下一个递归步骤,我们将最后一次递归产生的所有行 ( '20130103') 并使用它来产生一个新行 ( '20130104')

我看不到任何地方会出现重复。

在这里阅读更多:

递归执行的语义如下:

  1. 将 CTE 表达式拆分为锚和递归成员。

  2. 运行创建第一个调用或基本结果集 ( T0) 的锚成员。

  3. 将递归成员Ti作为输入和Ti+1输出运行。

  4. 重复步骤 3,直到返回一个空集。

  5. 返回结果集。这是UNION ALL一个T0to Tn

于 2013-01-25T07:58:32.763 回答