在哪些场景下,SQL Server ROW_NUMBER()不从1开始



我们在查询中使用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子句,因为无论如何您都在主查询中过滤行。

相关内容

  • 没有找到相关文章

最新更新