8

以下に、SQLクエリの非常に簡略化されたバージョンを貼り付けました。私が遭遇している問題は、ORDER BYステートメントが私のCTEの選択結果に影響を与えていることです。これがなぜであるかを理解できませんでした。私の当初の考えは、CTE内でいくつかのSELECTステートメントを実行し、その後、これらのORDER BY結果で機能するはずであるというものでした。

残念ながら、私が見ている動作は、私の内部SELECTステートメントがによる順序の影響を受けており、にない「アイテム」を与えてしまうことですTOP 10

データの例を次に示します:(IDの逆順でインデックス付け)

ID,   Date
9600  2010-10-12
9599  2010-09-08
9598  2010-08-31
9597  2010-08-31
9596  2010-08-30
9595  2010-08-11
9594  2010-08-06
9593  2010-08-05
9592  2010-08-02
....
9573  2010-08-10
....
8174  2010-08-05
....
38    2029-12-20

私の基本的な質問:

;with results as(
select TOP 10 ID, Date
from dbo.items
)
SELECT ID
FROM results

クエリは以下を返します:

ID,   Date
9600  2010-10-12
9599  2010-09-08
9598  2010-08-31
9597  2010-08-31
9596  2010-08-30
9595  2010-08-11
9594  2010-08-06
9593  2010-08-05
9592  2010-08-02

私のクエリORDER BY

;with results as(
select TOP 10 ID, Date
from dbo.items
)
SELECT ID
FROM results
ORDER BY Date DESC

クエリは以下を返します:

ID,   Date
38    2029-12-20
9600  2010-10-12
9599  2010-09-08
9598  2010-08-31
9597  2010-08-31
9596  2010-08-30
9595  2010-08-11
9573  2010-08-10
9594  2010-08-06
8174  2010-08-05

最初のクエリがテーブルのトップ10にあるIDのみを返し、2番目のクエリがテーブル全体のトップ10を返す理由を誰かが説明できますか(並べ替えが適用された後)。

4

2 に答える 2

14

SELECT TOP n使用するとき、決定論的な動作が必要な場合はORDER BYを指定する必要があります。そうしないと、サーバーは自由に10行を返すことができます。あなたが見ている振る舞いは完全に有効です。

この問題を解決するには、CTE内でORDERBYを指定します。

WITH results AS
(
    SELECT TOP 10 ID, Date
    FROM dbo.items
    ORDER BY ID DESC 
)
SELECT ID
FROM results
ORDER BY Date
于 2010-10-13T14:49:06.550 に答える
5

次のような新しい列を追加できると思います

SELECT ROW_NUMBER() OVER(ORDER BY <ColumnName>;) AS RowNo

次に、すべての列..これは、CTEアンカーを使用してクエリを実行するのに役立ちます... between、whereなどの句を使用します。

于 2013-08-19T06:49:59.100 に答える