[英]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.