2013-04-03 61 views
3

我與SQL Server的一個奇怪的問題,2012年SQL Server 2012的偏移返回相同的記錄

我用這樣的查詢

SELECT * FROM table ORDER BY field OFFSET 0 ROWS FETCH NEXT 25 ROWS ONLY 

我每次使用此查詢從0到25,25到50,50到75,75到100,它返回相同的25條記錄。

當我用100至125使用它,它返回原來的25至50等..

我的表只包含197記錄,這種情況只與我的數據庫的一個表。所有其他表正常工作。

當我通過代碼(ASP.NET C#)和SQL Management Studio直接使用查詢時,也會發生這種情況。

回答

1

你必須改變你的邏輯一點點,包括哪一頁是活動的:如果

DECLARE @pagesize AS BIGINT = 25, @pagenum AS BIGINT = 3; 

SELECT * 
FROM table 
ORDER BY field 
OFFSET @pagesize * @pagenum ROWS FETCH NEXT @pagesize ROWS ONLY; 
+0

我在我的C#代碼已經做到了這一點,所以我的查詢是相似的邏輯 –

+0

如果結果這個邏輯在數據庫端完成,它應該更快:) – veljasije

+0

移動數據庫端的邏輯將解決我原來的問題,但現在查詢不會返回所有記錄。 我有197條記錄,每頁25條記錄,在頁面n8我只有5條記錄,而不是22條(25 * 7 = 175,所以在第8頁我需要22條記錄) –

1

OFFSET FETCH NEXT怪胎出來,你是通過排序列不包含唯一的數據。要「假」的獨特列,你可以這樣做:

SELECT * FROM table 
ORDER BY ROW_NUMBER() over (order by field) 
OFFSET 0 ROWS FETCH NEXT 25 ROWS ONLY 
0

我有同樣的問題:查詢總是返回獨立相同的行偏移值(30):

OFFSET 30 ROWS FETCH NEXT 10 ROWS ONLY 

對我來說這個評論是正確的答案:

怪異的,也許你的ORDER BY列是不確定的,並使 問題。欄位欄可以包含重複項嗎?如果是這樣,請在ORDER BY子句中的字段列之後添加主鍵 。 - veljasije

我加入[ID]列到排序解決了這個問題:

ORDER BY [Status], [ID] ASC 
相關問題