SQL 分页方法

来源:互联网 发布:卡尔曼滤波算法 知乎 编辑:程序博客网 时间:2024/06/06 19:45

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

每页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
原创粉丝点击