0

このクエリは、変数で定義された日付範囲の間のすべての日を返し、結果セットは 31 の個別の値です。ただし、再帰 CTE は、最初のクエリが 1 回だけ実行され、2 番目のクエリが以前に作成された結果セットに対して機能するように機能します。したがって、重複があるように見えますが、異なる結果セットが返されました。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'され、datetime に変換されます。

最初の再帰ステップでは、最後の再帰または初期セット ( '20130101') によって生成されたすべての行を取得し、それを使用して を含む 1 つの新しい行を生成します'20130102'

次の再帰ステップでは、最後の再帰によって生成されたすべての行を取得し ( '20130102')、それを使用して 1 つの新しい行を生成します ( '20130103') 。

次の再帰ステップでは、最後の再帰によって生成されたすべての行を取得し ( '20130103')、それを使用して 1 つの新しい行を生成します ( '20130104') 。

重複が発生する場所はどこにもありません。

ここでもっと読む:

再帰的実行のセマンティクスは次のとおりです。

  1. CTE 式をアンカー メンバーと再帰メンバーに分割します。

  2. アンカー メンバーを実行して、最初の呼び出しまたは基本結果セットを作成します ( T0)。

  3. Ti入力および出力として再帰メンバーを実行しTi+1ます。

  4. 空のセットが返されるまで、手順 3 を繰り返します。

  5. 結果セットを返します。これは~UNION ALLのです。T0Tn

于 2013-01-25T07:58:32.763 に答える