VALUES子句的输出顺序是否保证与提及元素的顺序相同

时间:2015-05-29 06:56:07

标签: sql sql-server

是否保证此语句始终按照提及的顺序返回行?换句话说,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 个答案:

答案 0 :(得分:3)

没有。没有这样的保证。 SQL是一种基于集合的语言,其中{1,3}{3,1}是相同的。

您在订购时获得保证的唯一地方是使用ORDER BY子句时明确指定您正在使用的值的排序。

由于您的ORDER BY取决于ROW_NUMBER()表达式,而ORDER BY表达式使用完全不明确的0s,因此不存在排序保证。

答案 1 :(得分:1)

请参阅以下内容作为可能的答案:

  

无法保证查询返回的行使用   每次执行时,ROW_NUMBER()的排序方式都完全相同   除非满足以下条件。

     
      
  1. 分区列的值是唯一的。
  2.   
  3. ORDER BY列的值是唯一的。
  4.   
  5. 分区列和ORDER BY列的值组合是唯一的。   ROW_NUMBER()是不确定的。欲获得更多信息,   见确定性和非确定性函数。
  6.   

ROW_NUMBER (Transact-SQL)

答案 2 :(得分: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