2015-04-04 78 views
1

說明:意外的分頁結果與ORDER BY [Column A ] ASC OFFSET 0 ROWS FETCH FIRST 1 ROWS ONLY.If [Column A ]具有相同的值。獲取意外結果:ORDER BY [ColumnName] ASC OFFSET 0 ROWS FETCH FIRST 1 ROWS ONLY

注:我使用SQL Server 2012點快速

條件:

  1. 使用表達式:ORDER BY [Column A] ...

  2. [A列]:所有行具有相同的值。

試製:

案例1:

SELECT [Id],[Date]  
FROM [TestDateoffset] 
ORDER BY [Date] ASC 
OFFSET 0 ROWS 

當前的結果:

Id Date 
--------------------------------------- 
1 2015-01-24 21:40:30.0441628 +07:00 
2 2015-01-24 21:40:30.0441628 +07:00 
3 2015-01-24 21:40:30.0441628 +07:00 
4 2015-01-24 21:40:30.0441628 +07:00 

預期結果:

Id Date 
----------------------------------- 
1 2015-01-24 21:40:30.0441628 +07:00 
2 2015-01-24 21:40:30.0441628 +07:00 
3 2015-01-24 21:40:30.0441628 +07:00 
4 2015-01-24 21:40:30.0441628 +07:00 

狀態:PASS

案例2:

SELECT [Id],[Date]  
FROM [TestDateoffset] 
ORDER BY [Date] ASC 
OFFSET 0 ROWS FETCH FIRST 1 ROWS ONLY 

實際結果:

Id Date 
--------------------------------------- 
2 2015-01-24 21:40:30.0441628 +07:00 

預期結果:

Id Date 
--------------------------------------- 
1 2015-01-24 21:40:30.0441628 +07:00 

狀態:失敗

案例3:

SELECT [Id],[Date]  
FROM [TestDateoffset] 
ORDER BY [Date] ASC 
OFFSET 1 ROWS FETCH FIRST 1 ROWS ONLY 

實際結果:

Id Date 
--------------------------------------- 
2 2015-01-24 21:40:30.0441628 +07:00 

預期結果:

它有不同,以:

Id Date 
--------------------------------------- 
2 2015-01-24 21:40:30.0441628 +07:00 

狀態:失敗

結果總是相同的,如果我跑OFFSET 1行,或者OFFSET 2行,..:

Id Date 
--------------------------------------- 
2 2015-01-24 21:40:30.0441628 +07:00 

我的問題:

  1. 這是一個錯誤嗎?

  2. 案例2案例3:它是如何工作的?爲什麼我總是獲得第二張唱片?

我覺得背後"ORDER BY COLUMN ASC""ORDER BY COLUMN ASC OFFSET 0 ROWS FETCH FIRST 1""order"過程是不同的。但我不知道爲什麼和什麼是規則!

回答

3

您在Date上訂購,但所有日期相同,因此SQL Server可以按任意順序返回行。

要訂購的id當日期是平等的,你可以使用:

ORDER BY Date, Id OFFSET 0 ROWS FETCH FIRST 1 ROWS ONLY 
       ^^^^ 
+0

感謝您的及時回覆。所以,我必須在每個分頁查詢中爲我的ORDER添加「Id」,以確保我能得到預期的結果。我認爲這不是一個好習慣! – hungdoan 2015-04-04 10:52:19

+0

這是一個錯誤?因爲'SQL Server可以以任何順序返回行'是的,但至少它必須是穩定的,它必須有一個規則(按行鍵索引排序,..)。 例如:'OFFSET 0 ROWS FETCH FIRST 1 ROWS ONLY'和'OFFSET 2 ROWS FETCH FIRST 1 ROWS ONLY'無法在邏輯上返回相同的結果。 – hungdoan 2015-04-04 10:55:30

+1

這不是一個錯誤。您正在詢問無序集合的第一行。 SQL Server可以給你一個隨機的行來滿足你的條件。爲了限制SQL Server的自由度,您必須更加具體,並指定一個排序順序,將每行排序在一個唯一的位置。 – Andomar 2015-04-04 11:00:02