2015-12-22 42 views
3

我有一個T-SQL查詢到我需要返回頂部行的表。在MySQL中,這是按預期工作的,但在SQL Server中,我得到的返回的數據非常令人費解。SQL Server TOP關鍵字返回不同的結果

我附上了三個屏幕截圖:表格設計中的1個,當查看前1000行時只返回前10行和返回1個數據時返回的數據中的1個。您會注意到最上面一行包含兩個查詢之間名稱列的不同信息。

查詢的唯一區別是TOP關鍵字的計數值。該表共有7行數據。 Top 1000的結果包含返回的行的正確排序。這裏發生了什麼?

爲什麼SQL Server根據TOP關鍵字的計數值更改返回的行的順序?任何人都可以解釋或提供一種方法來保持這種一致性,無論有多少行被返回?

Table design

Top 10

Top 1000

+3

這就是所謂的非確定性排序。你需要添加tiebreaker,即。按項目編號排序。 –

回答

0

要在這個問題中添加一些上下文,我試圖實現的是MySQL和MSSQL在返回的行的順序中的一致性。我將一個使用MySQL的項目轉換爲MSSQL,這對我產生了一個問題。獲得我想要的解決方案是使用Set Rowcount 1來限制返回的行數。這產生了1行數據,這些數據的排列方式與MySQL相同。

+0

無論dbms平臺如何,在SQL中,所有集合都是「無序的」,直到您應用ORDER BY子句。假設其他任何事情都會產生錯誤和/或差異(如你所見)。一個很好的例子是GROUP BY,它在MySQL中具有生成有序結果的「外觀」,所以有些人不會打擾ORDER BY;這是不安全的,會令人失望。所以你的MySQL代碼可能會假定MSSQL還沒有應用。 &NB:如果你需要MSSQL的TOP(n),你必須申請一個命令來獲得一致的結果 –

6

有輸出沒有差別或問題。你被訂購的寬度和第2米的寬度是相同的,你沒有任何子的順序,使離開的決定到RDBMS(其查詢優化器專)提出whichever first

您還應該添加itemNumberORDER BY子句後Width

ORDER BY Width, itemNumber 
6

Order by不能保證,得到相同的結果爲相等的值作爲SQL表表示無序集合。而且因爲你的寬度是相同的,所以你會得到不同的結果。

要獲得唯一結果或使您的排序穩定,您需要在order by子句中添加一個名稱,如itemNumber