2015-05-29 31 views
1

該語句是否保證始終按提到的順序返回行?換句話說,VALUES子句中的元素是否總是按從左到右的順序進行評估?是否保證VALUES子句的輸出順序與提及元素的順序相同

SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS orderCol, id 
FROM (VALUES (103), (7), (6), (16), (50), (41), (80), (67), (64)) x(id) 
ORDER BY orderCol 

預計訂購:

103 
7 
6 
16 
50 
41 
80 
67 
64 

回答

3

號有沒有這樣的保證。 SQL是基於集合的語言,其中{1,3}{3,1}是相同的東西。

當您使用ORDER BY子句明確指定您正在使用的值的排序時,唯一可以獲得排序保證的地方是。

由於您ORDER BY取決於ROW_NUMBER()表達,反過來,使用一個ORDER BY這是完全曖昧,不存在排序保證。

+0

正當我以爲,但無法找到提到明確的價值觀條款的任何文件。 –

0

如果你想真的真的確信那麼也許這是一個選項:

DECLARE @values TABLE 
    (
     ID INT IDENTITY(1,1) PRIMARY KEY, 
     value INT 
    ) 
INSERT INTO @values VALUES (103), (7), (6), (16), (50), (41), (80), (67), (64) 


SELECT value FROM @values ORDER BY ID 
+0

這裏指定的身份值的順序不能保證。 –

+0

事實上,這個答案非常重要,因爲它*認爲*值子句*確實按照確定性順序產生值。 –

+0

真的嗎? IDENTITY(1,1)對我來說意味着:從1的值開始,爲每個新的行增加1!?它是一個表變量,所以每次執行這個批處理時,表身份重新編號爲 – CeOnSql

1

請看下面爲可能的答案:

不保證該行被返回使用 進行查詢除非滿足以下條件,否則ROW_NUMBER()將與每次執行 完全相同。

  1. 分區列的值是唯一的。
  2. ORDER BY列的值是唯一的。
  3. 分區列和ORDER BY列的值的組合是唯一的。 ROW_NUMBER()是不確定的。有關更多信息,請參閱 參見確定性和非確定性函數。

ROW_NUMBER (Transact-SQL)

相關問題