假设我有一个包含记录的表项(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
欢迎任何帮助
答案 0 :(得分:2)
以及Panagiotis提到的结果的未定义顺序
如果发生关系,ROW_NUMBER
的结果是不确定的。您需要在ORDER BY
中添加一个唯一列的tie tie,以便Number=3
的两行应用确定的编号。
假设Id
是唯一的,以下将是确定性的
SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number,I.Id) RN
FROM Item I
ORDER BY RN
答案 1 :(得分:1)
您没有为最终结果指定任何顺序,因此您对结果的显示方式没有任何保证。
要按行号(RN)排序,您应该添加ORDER BY RN子句:
SELECT I.Id,ROW_NUMBER()OVER(ORDER BY I.Number) RN
FROM Item I
ORDER BY RN
除非您提出要求,否则服务器不会以任何特定方式对结果进行排序。这意味着结果将按服务器处理它们的顺序显示。
服务器为每个查询创建一个执行计划,该计划可以对数据进行排序以加速处理并使用可能也会影响排序的不同连接技术。执行计划的形式取决于索引的存在以及所涉及的表的统计信息。最后,服务器可以使用并行执行计划,在这种情况下,最终合并来自不同核的部分结果集。
您可能永远不会通过简单查询注意到这一点,但即使对于同一服务器,结果顺序也可能会发生变化,因为数据和统计信息会随着时间的推移而变化,从而导致执行计划不同。
答案 2 :(得分: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_NUMBER
规范和ORDER BY
子句中。