是否保证此语句始终按照提及的顺序返回行?换句话说,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
答案 0 :(得分:3)
没有。没有这样的保证。 SQL是一种基于集合的语言,其中{1,3}
和{3,1}
是相同的。
您在订购时获得保证的唯一地方是使用ORDER BY
子句时明确指定您正在使用的值的排序。
由于您的ORDER BY
取决于ROW_NUMBER()
表达式,而ORDER BY
表达式使用完全不明确的0s
,因此不存在排序保证。
答案 1 :(得分:1)
请参阅以下内容作为可能的答案:
无法保证查询返回的行使用 每次执行时,ROW_NUMBER()的排序方式都完全相同 除非满足以下条件。
- 分区列的值是唯一的。
- ORDER BY列的值是唯一的。
- 分区列和ORDER BY列的值组合是唯一的。 ROW_NUMBER()是不确定的。欲获得更多信息, 见确定性和非确定性函数。
醇>
答案 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