我们在查询中使用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/

10-13 09:30