考えられる説明のデモンストレーション。
テーブル スクリプトの作成
SELECT * INTO #T FROM master.dbo.spt_values CREATE NONCLUSTERED INDEX [IX_T] ON #T ([name] DESC,[number] DESC);
プレ>クエリ 1 (35 件の結果を返す)
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY NAME) AS rn FROM #T ) SELECT c1.number,c1.[type] FROM cte c1 JOIN cte c2 ON c1.rn=c2.rn AND c1.number <> c2.number
プレ>クエリ 2 (前と同じですが、選択リストに c2.[type] を追加すると 0 の結果が返されます);
WITH cte AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY NAME) AS rn FROM #T ) SELECT c1.number,c1.[type] ,c2.[type] FROM cte c1 JOIN cte c2 ON c1.rn=c2.rn AND c1.number <> c2.number
プレ>理由
重複する NAME の row_number() は指定されていないため、必要な出力列の最適な実行計画に適合するものを選択するだけです。 2 番目のクエリでは、これは両方の cte 呼び出しで同じです。最初のクエリでは、異なるアクセス パスが選択され、その結果、row_numbering が異なります。
推奨される解決策
ROW_NUMBER() over (order by t.[Date])
で CTE に参加しています予想に反して、CTE はおそらく 実現しない これにより、自己結合の一貫性が保証されるため、
ROW_NUMBER()
間の相関関係を想定します[Date]
が重複しているレコードには存在しない可能性があります。
ROW_NUMBER() over (order by t.[Date], t.[id])
を試すとどうなりますか 日付が同点の場合、row_numbering が一貫した順序であることが保証されます。 (または、id ができない場合にレコードを区別できる他の列/列の組み合わせ)