簡體   English   中英

SQL ROW_NUMBER和排序問題

[英]SQL ROW_NUMBER and sorting issue

在SQL 2005/2008數據庫中,我們有表BatchMaster。 列:RecordId bigint - autoincremental id,BatchNumber bigint - 唯一的非聚集索引,BatchDate)。 我們有sproc返回此表中的分頁數據。 該sproc適用於大多數客戶端,但在一個SQL服務器實例中,我們遇到記錄順序問題。 一般來說,我們這樣做

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排序的記錄。 對於我們的一位客戶來說,這不會發生: 在此輸入圖像描述

記錄順序錯誤。 另外,請注意第一列(行),它不是按升序排列的。

有人能解釋為什么這樣嗎?

您的代碼實際上並沒有對結果進行排序,它只根據BatchDate和Batchnumber的順序設置'Row',並且似乎正確地執行了此操作。 您需要在語句中添加ORDER BY Row。

假設您希望具有最小Row號的給定BatchDate的最低BatchNumber以及您希望按Row進行BatchDate ,請嘗試以下操作:

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

更改查詢以在最外層查詢中包含排序

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

ROW_NUMBER排名函數中的ORDER BY子句僅適用於計算該排名函數的值,它實際上並不對結果進行排序。

如果您希望按特定順序返回記錄,則需要在查詢中指定: ORDER BY [Row]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM