1

レコードを持つテーブルアイテム(Id int Primary Key、Number INT)があるとします

Id    Number
100     3
200     3

今、私はクエリを実行しています

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number) RN
FROM Item I

私のマシンの結果セットでは

Id   RN
100   1
200   2

今私の質問は、この結果セットがすべてのマシン上にあるのか、または一部のマシンで次のように変更される可能性があるのか​​ということです

Id   RN
200   1
100   2

どんな助けでも大歓迎です

4

3 に答える 3

2

パナギオティスが言及した結果の未定義の順序と同様に

ROW_NUMBER同点の場合の結果は不確定です。一意の列のタイブレーカーをに追加しORDER BYて、2つの行にNumber=3決定論的な番号が適用されるようにする必要があります。

Id一意であると仮定すると、次のことが決定論的です

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number,I.Id) RN
FROM Item I
ORDER BY RN
于 2012-06-21T07:12:28.523 に答える
1

最終結果の順序を指定しないため、結果がどのように表示されるかについての保証はありません。

行番号(RN)で並べ替えるには、ORDERBYRN句を追加する必要があります。

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number) RN 
FROM Item I
ORDER BY RN

サーバーは、要求しない限り、特定の方法で結果を並べ替えることはありません。これは、結果がサーバーによって処理された順序で表示されることを意味します。

サーバーは、クエリごとに実行プランを作成します。このプランは、データを並べ替えて処理を高速化し、順序付けにも影響を与える可能性のあるさまざまな結合手法を使用します。実行プランの形式は、インデックスの存在と関連するテーブルの統計によって異なります。最後に、サーバーは並列実行プランを使用する場合があります。その場合、異なるコアからの部分的な結果セットが最終的にマージされます。

単純なクエリではおそらくこれに気付くことはありませんが、同じサーバーでもデータと統計が時間とともに変化するため、結果の順序が変化し、実行プランが異なる可能性があります。

于 2012-06-21T07:01:15.030 に答える
0

結果セットは次のいずれかになります。

Id        RN
100        1
200        2

また、

Id        RN
200        1
100        2

また、

Id        RN
100        2
200        1

また、

Id        RN
200        2
100        1

SQL のルールは非常に単純です。特定の順序付けが必要な場合は、それを要求する必要があります。順序付けの指定が不完全な場合、システムは、指定された指定に準拠している限り、最も便利な順序で行を自由に配置できます。

特定の順序付けを強制する場合は、完全に指定してください。たとえば、常に最初の結果が必要な場合は、仕様内と句ORDER BY I.Number,I.Idの両方でそれを指定して保持します。ROW_NUMBERORDER BY

于 2012-06-21T07:14:15.467 に答える