SQL 分页方法

通过网上的资料和自己整理出来,总结的分页方法 。

每页2条数据,查询第三页。

1、 SELECT TOP 2 * FROM [Travel].[dbo].[ScenicHotel] WHERE ID NOT IN (SELECT TOP 4 ID FROM [Travel].[dbo].[ScenicHotel])

2、  SELECT TOP 2 * FROM [Travel].[dbo].[ScenicHotel] WHERE (
  ID> 
  (SELECT MIN(ID) FROM [Travel].[dbo].[ScenicHotel] WHERE ID>4 )
  )

前两种运用子查询,前提需要保证ID连续。所以一般设计多表查询或者大数据时就不怎么好用。就当是一种了解。


3、

之前写的一个分页存储过程,使用sp_executesql 扩展存储过程。其中会生成临时表。

--执行带输出参数的动态SQL,返回总行数,总页数
create proc SSS
@type varchar(50),
@sql varchar(500),
@pageCount int,@pageIndex int, --一页几条,第几页
@Count int output,@Index int output --总条数,总页数
as

declare @s varchar(max)
declare @newS varchar(max)
declare @getCount nvarchar(max)
if @type='Audition'
begin
set @s='(select*from Audition '+@sql+'  )as a ' --查询出的新表
--执行动态SQL,查询所查页的信息
set @newS='select top '+CONVERT(varchar,@pageCount)+' * from '+@s +' where AuditionID not in 
(select top '+CONVERT(varchar,( @pageCount*(@pageIndex-1)))+' AuditionID   from '+@s +' order by InterviewDate  desc)order by InterviewDate  desc'
exec (@newS)
set @getCount='select  @Count= COUNT(*) from '+ @s+' select  @Index=CEILING( COUNT(*)/CONVERT(float,'+CONVERT(varchar, @pageCount)+')) from '+@s
exec sp_executesql @getCount,N'@Count int output,@Index int output',@Count output,@Index output
end
else
begin
set @s='(select*from Resume '+@sql+' )as a ' --查询出的新表
--执行动态SQL,查询所查页的信息
set @newS='select top '+CONVERT(varchar,@pageCount)+' * from '+@s +' where ResumeID not in 
(select top '+CONVERT(varchar,( @pageCount*(@pageIndex-1)))+' ResumeID   from '+@s +' order by TimeOfSubmitResume desc )order by TimeOfSubmitResume desc'
exec (@newS)
set @getCount='select  @Count= COUNT(*) from '+ @s+' select  @Index=CEILING( COUNT(*)/CONVERT(float,'+CONVERT(varchar, @pageCount)+')) from '+@s
exec sp_executesql @getCount,N'@Count int output,@Index int output',@Count output,@Index output
end
go


declare @C int,@I int
exec SSS '[Resume]',' where Nation=''汉族'' ',3,2,@C output,@I output 
print @C
print @I

4、

使用临时表,临时表中有两个字段,一个是自增长ID,一个是符合条件的CID。然后进行表连接,查询第几页数据就可以了,现在貌似已经不常用临时表了。

  DECLARE @tab TABLE
  (
ID INT PRIMARY KEY IDENTITY(1,1),
CID int 
  )
  INSERT INTO @tab 
          (  CID )
  SELECT ID FROM [Travel].[dbo].[ScenicHotel]  WHERE 1=1 
  SELECT COUNT(*)FROM @tab
  SELECT TOP 2 * FROM [Travel].[dbo].[ScenicHotel] sh LEFT JOIN @tab t ON t.CID=sh.ID WHERE t.ID>4


5、

ROW_NUMBER() OVER 。现在的主流分页方式它是SQL中的一个内置函数,作用和临时表中的自增长ID一样。

再加上一般情况下用户只会使用点击前几页数据,所以性能是最好的。(推荐使用)

SELECT COUNT(1) FROM [Travel].[dbo].[ScenicHotel] WHERE 1=1 --总条数
  
  SELECT * FROM 
  (SELECT ROW_NUMBER() OVER( ORDER BY ID)AS RNum,ID,Comments FROM [Travel].[dbo].[ScenicHotel] )T
  WHERE T.RNum>4




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值