2012-06-21 35 views
1

假設我有一個表項(ID INT主鍵,號碼INT),具有記錄確實ORDER BY的結果總是一樣的(SQL Server 2005,2008)?

Id Number 
100  3 
200  3 

現在我在我的機器的結果集運行查詢

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number) RN 
FROM Item I 

Id RN 
100 1 
200 2 

現在我的問題是這個結果集是在所有機器上,還是在某些機器上它可能會改變爲

Id RN 
200 1 
100 2 

歡迎任何幫助

+0

歡迎來到StackOverflow:如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)格式和語法突出顯示它!這樣做,您不再需要任何' '和'
'標籤! –

回答

2

除了由帕納約蒂斯

提到結果的未確定的訂單的ROW_NUMBER結果是關係的事件undeterministic。您需要在ORDER BY中添加一個唯一列的聯繫斷路器,以便Number=3的兩行具有應用的確定性編號。

假設Id是獨特下面將確定性

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number,I.Id) RN 
FROM Item I 
ORDER BY RN 
1

你不指定任何次序對最終結果,所以你不會對結果怎麼會出現任何保證。

要通過行號(RN)命令你應該添加一個ORDER BY子句RN:

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number) RN 
FROM Item I 
ORDER BY RN 

的服務器,除非你要求它沒有訂購任何特定方式的結果。這意味着結果將按服務器處理的順序顯示。

服務器爲每個查詢創建執行計劃,可以對數據進行排序以加快處理速度並使用不同的連接技術,這些技術也可能會影響排序。執行計劃的形式取決於索引的存在和相關表的統計。最後,服務器可以使用並行執行計劃,在這種情況下,最終將合併來自不同核心的部分結果集。

您可能永遠也不會注意到這一點,但是對於同一臺服務器,結果順序可能會發生變化,因爲數據和統計信息會隨着時間而改變,從而導致不同的執行計劃。

+0

而且它與SQL服務器版本沒有任何關係,就像40年左右的SQL規範中那樣。 SQL是基於SET的,集合沒有內在順序。 – TomTom

0

結果集可以是任何的:

Id  RN 
100  1 
200  2 

,或者

Id  RN 
200  1 
100  2 

,或者

Id  RN 
100  2 
200  1 

,或者

Id  RN 
200  2 
100  1 

SQL的規則很簡單 - 如果你想一個特定順序,你要問它。如果未完成指定了一個排序,那麼系統可以自由地按照它找到的最方便的順序排列行,只要它符合您給定的具有的規格即可。

如果要強制執行特定順序,請完全指定它。例如。如果您始終需要第一個結果,請指定ORDER BY I.Number,I.Id,並且在ROW_NUMBER規範和ORDER BY子句中都有。