5

我们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 开始?

4

1 回答 1

11

row_number始终以 1 开头。

返回结果集分区内行的序号,每个分区的第一行从 1 开始。

您正在执行select top没有 order by 子句的操作。这意味着您无法控制返回的行。您可能会获得使用不同索引来获取行的不同执行计划。一个计划中的前 100 行与另一个计划中的前 100 行不同。向 CTE 中的查询添加相关的 order by,或者您可以删除 top 子句,因为无论如何您都在过滤主查询中的行。

于 2011-11-16T06:08:53.423 回答