在哪些情况下,SQL Server行号()不从1开始?
我们在查询中使用的是在哪些情况下,SQL Server行号()不从1开始?,sql,sql-server,tsql,analytic-functions,Sql,Sql Server,Tsql,Analytic Functions,我们在查询中使用的是ROW\u 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
ROW\u 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中的行编号()
函数值从1开始时,语法中是否有需要修改的内容,或者是否有需要更改的设置?始终从1开始
返回结果分区内行的序列号
设置,从每个分区中第一行的1开始
您正在执行一个选择top
,但没有ORDERBY子句。这意味着您无法控制返回的行。您可能会得到使用不同索引获取行的不同执行计划。一个计划中的前100行与另一个计划中的前100行不同。在CTE中的查询中添加一个相关的order by,或者您可以删除top子句,因为您正在筛选主查询中的行。旁注:我不会将我的CTE命名为以开头的某个名称。
-该字符表示存储在TempDB
中的临时表。。。。改名