分页算法
SQLSERVER 分页方案一:(利用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 ------------------------------------- 分页方案二:(利用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 ------------------------------------- 分页方案三:(利用SQL的游标存储过程分页) create???? procedure Page @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的游标存储过程分页)?????? 效率最差,但是最为通用 在实际情况中,要具体分析。 方案四: select * from ( select * from (select top 20*4 唯一ID,其他字段 from 表集 where 条件 order by 排序) as a union all select * from (select top 20*5 唯一ID,其他字段 from 表集 where 条件 order by 排序) as b ) a group by 唯一ID,其他字段 having count(唯一ID)=1???? order by 排序 方案五:(多次排序法) 找第八页,每页100条 select top 100 * from ???????? (select top 800 * from pageDemo a order by a.id desc) b ???????? order by b.id asc ?top 和 order by 的执行顺序是order by先,top后 oracle的更简单, 方案一:rownum<100 and rownum<200 方案二, select *** minus select (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |