2016-05-12 36 views
3

我目前使用的是Sql Server 2014 Professional,當前版本是(12.0.4100)。我有一個視圖,我想要選擇具有特定偏移量的10行。
我的看法是象下面這樣:在Sql Server 2014 ORDER BY子句與OFFSET FETCH NEXT返回奇怪的結果

BeginTime |  EndTime | Duration | Name 
09:00:00.0000000|16:00:00.0000000| 1  | some_name1 
09:00:00.0000000|16:00:00.0000000| 2  | some_name2 
09:00:00.0000000|16:00:00.0000000| 3  | some_name3 
09:00:00.0000000|16:00:00.0000000| 4  | some_name4 
09:00:00.0000000|16:00:00.0000000| 5  | some_name5 
09:00:00.0000000|16:00:00.0000000| 6  | some_name6 
09:00:00.0000000|16:00:00.0000000| 7  | some_name7 

有100行這樣的,所有在BeginTimeEndTime值完全相同。相關表格中的持續時間從1增加到100。
如果只是查詢:

SELECT * FROM View_Name 

ResultSet是正確的。我可以通過檢查持續時間欄來了解它。

如果我只想從0開始讀取10行,那麼ResultSet是正確的,並且從18開始是正確的。當我想從19或19以上開始讀取10行時,ResultSet中的Duration返回不相關的結果像持續時間逆轉。但它永遠不會返回它具有持續的行超過11 我用瞭如下獲取特定行查詢:

SELECT * FROM View_Name ORDER BY BeginTime ASC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY 

也有一些奇怪的事情在這種情況下,如果我指定USE master,則此問題消失,但如果指定USE [mydb_name],則問題再次出現。
順便說一句,我在本地PC中使用SQL SERVER 2014 Professional v(12.0.2269),這個問題因上述情況而消失。

PS:我無法使用USE master,因爲我正在動態創建並列出視圖,並將其存儲在「存儲過程」中。
任何幫助,回答或評論都將被接受。
謝謝!

回答

0

你的訂單應該是唯一的,否則你會得到不確定的結果(在你的情況下,開始時間不是唯一的,你不保證每次都得到相同的結果)。 ..

SELECT * FROM View_Name ORDER BY duration OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY 

進一步增加,你的第一個查詢(請從視圖*)結果集不保證準確每次是,除非你有被外訂單。

+0

感謝響應,我希望你認真閱讀問題。 –

+0

請澄清什麼是正確的,不正確的,我假設與第一個查詢你得到正確的結果(這也是沒有guranteed,除非你有一個外部訂單)和偏移量和取得你不相同。 – TheGameiswar

+0

'SELECT * FROM View_Name ORDER BY BeginTime ASC'返回正確的順序!請留意。 –

7

documentation解釋:

要使用OFFSETFETCH實現查詢請求之間穩定的結果,下面的條件必須滿足:

。 。 。

  1. ORDER BY子句包含保證爲唯一的列或列組合。

你的情況會發生什麼事是,BeginTime不是唯一的。通常的數據庫 - 特別是SQL Server - 不實現穩定的排序。穩定的排序是按鍵相同時行數相同的排序。這很明顯,因爲表和結果集表示無序集合。他們沒有固有的順序。

所以,你需要一個獨特的關鍵,使排序穩定。鑑於你的數據,這似乎是要麼durationname,或兩者:

SELECT * 
ROM View_Name 
ORDER BY BeginTime ASC, Duration, Name 
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY; 
+0

感謝您對Linoff先生的回覆,這很有幫助,並且效果很好。但是,如果視圖中沒有唯一列,該怎麼辦?視圖在我的web應用程序中動態顯示。並且;爲什麼在使用master時這個問題會消失? –

+0

@AlicanUzun。 。 。僅僅因爲這個查詢似乎有效,並不意味着它的工作原理*一致*。 –