declare
@bid int --开始id
,@eid int --结束id
set @bid='1'
set @eid='18'
select * from (select row_number()over(order by vaa03 ) id ,编码
from 基础表
where right(convert(varchar(20),生日,23),5)
=right(convert(varchar(20),GETDATE(),23),5))a
where id between @id and @ids
之前查阅了一些资料,自己认为2008版本的数据库,利用row_number()over() 函数,对查询结果进行分页还是比较简单易懂的。
上述代码是查询当天过生日的人,并利用row_number()over() 函数生成id,然后利用between ''and'' 对id 进行查询。即实现分页查询。
row_number()over() 分页还是比较高效的,相比top to p
分页也要优雅很多(尴尬一笑)。
当然ROW_NUMBER
分页在大页数时存在性能问题,是可以通过一些技巧来进行规避的。如果你的条件中带有运算符或者使用函数等,则查询引擎会放弃优化,而执行表扫描。如下代码,执行时间1秒,而去掉WHERE条件后执行时间不到一秒。后来才知道 这叫欺骗查询引擎。
select * from (select row_number()over(order by vaa03 ) id ,VAA03
from VAA1
where right(convert(varchar(20),vaa12,23),5)=right(convert(varchar(20),GETDATE(),23),5))a
where id in('1000','1018')