分页很重要,面试会遇到。不妨再回顾总结一下。
1、创建测试环境,(插入100万条数据大概耗时5分钟)。
createdatabaseDBTest useDBTest
--创建测试表 createtablepagetest ( idintidentity(1,1)notnull, col01intnull, col02nvarchar(50)null, col03datetimenull )
--1万记录集 declare@iint set@i=0 while(@i<10000) begin insertintopagetestselectcast(floor(rand()*10000)asint),left(newid(),10),getdate() set@i=@i+1 end |
2、几种典型的分页sql,下面例子是每页50条,198*50=9900,取第199页数据。
--写法1,not in/top selecttop50*frompagetest whereidnotin(selecttop9900idfrompagetestorderbyid) orderbyid
--写法2,not exists selecttop50*frompagetest wherenotexists (select1from(selecttop9900idfrompagetestorderbyid)awherea.id=pagetest.id) orderbyid
--写法3,max/top selecttop50*frompagetest whereid>(selectmax(id)from(selecttop9900idfrompagetestorderbyid)a) orderbyid
--写法4,row_number() selecttop50*from (selectrow_number()over(orderbyid)rownumber,*frompagetest)a whererownumber>9900
select*from (selectrow_number()over(orderbyid)rownumber,*frompagetest)a whererownumber>9900andrownumber<9951
select*from (selectrow_number()over(orderbyid)rownumber,*frompagetest)a whererownumberbetween9901and9950
--写法5,在csdn上一帖子看到的,row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号 select* from( selectrow_number()over(orderbytempColumn)rownumber,* from(selecttop9950tempColumn=0,*frompagetestwhere1=1orderbyid)a )b whererownumber>9900 |