5

SQL 2005/2008 データベースには、テーブル BatchMaster があります。列: RecordId bigint - 自動増分 ID、BatchNumber bigint - 一意の非クラスター化インデックス、BatchDate)。このテーブルからページ分割されたデータを返す sproc があります。その sproc はほとんどのクライアントで問題なく動作しますが、ある SQL サーバー インスタンスでレコードの順序に問題があります。一般に、sproc では

select * from
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber desc) as Row,
    *
    from dbo.BatchMaster bm with (nolock)
)
where Row between @StartingRow and @EndgingRow

上記のスクリプトからわかるように、BatchDate と BatchNumber でソートされたレコードを返す必要があります。それは私たちのクライアントの1人には起こりません: ここに画像の説明を入力

レコードの順序が間違っています。また、最初の列 (行) に注意してください。昇順ではありません。

誰かがその理由を説明できますか?

4

4 に答える 4

8

あなたが最小の数でBatchNumber与えられたものに対して最低のものを望み、そしてあなたがによって注文者を欲していると仮定して、これを試してください:BatchDateRowRow

select * from
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber asc) as Row,
    *
    from dbo.BatchMaster bm with (nolock)
)
where Row between @StartingRow and @EndgingRow
order by Row
于 2012-06-11T13:22:22.220 に答える
7

コードは実際には結果を並べ替えません。BatchDateとBatchnumberの順序に基づいて「行」を設定するだけで、正しく実行されているように見えます。ステートメントにORDERBY行を追加する必要があります。

于 2012-06-11T13:22:10.510 に答える
2

クエリを変更して、最も外側のクエリに並べ替えを含める

select * from
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber desc) as Row,
    *
    from dbo.BatchMaster bm with (nolock)
)
where Row between @StartingRow and @EndgingRow
order by Row
于 2012-06-11T13:22:44.077 に答える
2

ランキング関数のORDER BY句は、ROW_NUMBERそのランキング関数の値の計算にのみ適用され、実際に結果を並べ替えるわけではありません。

レコードを特定の順序で返したい場合は、クエリでそれを指定する必要があります。ORDER BY [Row]

于 2012-06-11T13:26:38.577 に答える