1

假设我有一个表 Item (Id int Primary Key, Number INT) 有记录

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

欢迎任何帮助

4

3 回答 3

2

以及 Panagiotis 提到的未定义的结果顺序

如果有关系,结果ROW_NUMBER是不确定的。您需要将唯一列的决胜局添加到 ,ORDER BY以便Number=3应用确定性编号的两行。

假设Id是唯一的,以下将是确定性的

SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number,I.Id) RN
FROM Item I
ORDER BY RN
于 2012-06-21T07:12:28.523 回答
1

您没有为最终结果指定任何顺序,因此您无法保证结果的显示方式。

要按行号 (RN) 排序,您应该添加 ORDER BY RN 子句:

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

除非您请求,否则服务器不会以任何特定方式对结果进行排序。这意味着结果将按照服务器处理它们的顺序出现。

服务器为每个查询创建一个执行计划,该计划可以对数据进行排序以加快处理速度,并使用可能也会影响排序的不同连接技术。执行计划的形式取决于索引的存在和所涉及的表的统计信息。最后,服务器可以使用并行执行计划,在这种情况下,来自不同内核的部分结果集最终会被合并。

您可能永远不会通过简单的查询注意到这一点,但是即使对于同一台服务器,结果顺序也可能会随着数据和统计信息的变化而变化,从而导致不同的执行计划。

于 2012-06-21T07:01:15.030 回答
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_NUMBERORDER BY

于 2012-06-21T07:14:15.467 回答