我们在查询中使用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开头。
返回结果分区内一行的序号设置,每个分区的第一行从1开始。
你正在做一个没有order by子句的select top
。这意味着您无法控制返回的行。您可能会得到不同的执行计划,使用不同的索引来获取行。一个计划中的前100行与另一个计划中的前100行不同。在CTE的查询中添加一个相关的order by,或者您可以删除top子句,因为无论如何您都在主查询中过滤行。