三种SQL分页法

时间:2010-05-07 11:03:00 

表中主键必须为标识列,[ID] int IDENTITY (1,1)

1.分页方案一:(利用Not In和SELECT TOP分页)
语句形式:  
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP 20 id
         FROM TestTable
         ORDER BY id))
ORDER BY ID


SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP 页大小*页数 id
         FROM 表
         ORDER BY id))
ORDER BY ID

2.分页方案二:(利用ID大于多少和SELECT TOP分页)
语句形式:  
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP 20 id
                 FROM TestTable
                 ORDER BY id) AS T))
ORDER BY ID


SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP 页大小*页数 id
                 FROM 表
                 ORDER BY id) AS T))
ORDER BY ID

 3.分页方案三:(利用SQL的游标存储过程分页)

create  procedure SqlPager
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
 @rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用

标签:sql,分页,主键
0
投稿

猜你喜欢

  • asp压缩access数据库方法代码

    2008-08-08 12:22:00
  • position两三事

    2009-02-16 15:23:00
  • 安装PHP遇到“无法载入mysql扩展”解决方法

    2007-06-15 15:04:00
  • 发布淘宝开源编辑器 KISSY Editor 1.0.0

    2009-10-27 16:20:00
  • 如何制作K线图?

    2010-06-29 17:25:00
  • 10个ASP网页制作技巧

    2007-09-24 13:12:00
  • php基础字符串与数组知识点讲解

    2023-05-25 08:28:14
  • 实例学习call、apply、callee用法

    2009-03-27 17:56:00
  • 语言化H1标签

    2008-01-11 13:54:00
  • 正则表达式学习笔记

    2008-04-15 07:44:00
  • 网页布局的位置重心与位置间的对比关系

    2007-10-15 19:20:00
  • 用IE浏览器UTF-8页面是一片空白

    2009-06-14 19:55:00
  • ASP访问数量统计代码

    2011-04-08 10:59:00
  • js模拟抽奖代码

    2008-07-20 12:38:00
  • 最近写的一个asp缓存函数

    2008-11-25 14:07:00
  • 关于window.opener的用法

    2008-02-23 11:03:00
  • SQL存储过程初探

    2009-09-09 14:22:00
  • 通过作业调度建立SQL Server的自动备份

    2008-12-09 14:58:00
  • 讲解SQL Server数据库触发器的安全隐患

    2009-02-24 17:46:00
  • 利用SQL语言有没有办法查到表中哪些记录中的全部

    2009-04-10 18:29:00
  • asp之家 网络编程 m.aspxhome.com