我们在查询中使用ROW_NUMBER()
。几乎在所有情况下它都返回正确的结果。但是对于1个用户,它的行为却大不相同。
With #TEST as (
select top 50
ROW_NUMBER() over (order by a.ID) as RN,
a.ID ID, a.Name Name
FROM a
where a.name like '%test%')
select *
from #TEST
where RN BETWEEN 1 AND 50
order by RN
当页面大小设置为50时,该查询对该用户而言运行良好。但是,当页面大小设置为100时,我们观察到它不会返回所有行。它仅返回10行。即使有100多个满足条件的结果。请找到以下无法正常运行的查询。
With #TEST as (
select top 100
ROW_NUMBER() over (order by a.ID) as RN,
a.ID ID, a.Name Name
FROM a
where a.name like '%test%')
select *
from #TEST
where RN BETWEEN 1 AND 100
order by RN
当尝试验证原因时,我们观察到第二个查询返回的RN值大于100。它不是从1开始的。
有人可以解释这种现象的可能原因。是否需要在语法中进行任何修改,或者是否需要更改SQL Server中的
row_number()
函数值从1开始的任何设置? 最佳答案
row_number始终以1开头。
您正在执行select top
,而没有order by子句。这意味着您无法控制返回哪些行。您可能会得到不同的执行计划,该计划使用不同的索引来获取行。一个计划中的前100行与另一计划中的前100行不同。将相关顺序添加到CTE中的查询中,或者可以删除top子句,因为无论如何您要过滤主查询中的行。
关于sql - 在哪种情况下,SQL Server ROW_NUMBER()不能从1开始?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8147385/