楼上说的这个方法都不错(注均为SQLServer,若为其它数据库请自行更改SQL语句即可):
语句一:
select * from
(
select * from (select top 10*4 唯一ID,其他字段 from 表集 where 条件 order by 排序) as a
union all
select * from (select top 10*5 唯一ID,其他字段 from 表集 where 条件 order by 排序) as b
)
a
group by 唯一ID,其他字段 having count(唯一ID)=1 order by 排序
但我研究了一下,用这样的语句速度似乎更快一些:
语句二:
SELECT TOP 10 * FROM [表集] where [唯一ID] not in (SELECT TOP 20*5 [唯一ID] FROM [表集] ORDER BY [唯一ID]) ORDER BY [唯一ID]
偶详观各数据库SQL,得出是数据库就有取前面N条记录的SQL语法,如什么select top n*****之类的语法,而数据分页的关键问题是取后N条记录的语法偶深思良久,最后小悟,故出此言,还忘前辈们多多指点
取记录集后N条记录的大法:
假设:
1.有一sql语句将产生1000条记录 (select 唯一ID,其他字段 from 表集 where 条件 order by 排序)
2.每页显示20条记录
3.当前显示第5页
实现如下:
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 排序
我觉得也可以这样:比如说一页显示15条记录,那么第一页就是select top 15,然后,取得第16条记录的ID,和第31条记录的ID,然后将这两个值传入下一页,这样以后页的SQL就是select * from table where id>=16 and id<=31
然后就一直这样传下去。
不知道这个方法怎么样?
存储过程其实也差不多,只不过是在后台处理,再回传一个对象集,如果是远端服务器的话肯定是用这种方式,如果是本机,那速度是差不多的
create pro aa(@page int,@size int)
as
declare @size1 int,@size2 int
set @size1=@size*(@page+1)
set @size2=@size*@page
select top @size1 * into #aaa from table
select top @size2 * into #bbb from table
--其中ID是关键字,可以换成你的关键字
select * from #aaa where id not in (select id from #bbb)
楼主,我刚刚也做了个跟你差不多的东西,不过是用ORACLE做的,我提供点思路给你,不过要达到你的要求可能就没有,真要你说的那么快,那只有提高硬件性能!
我用ORACLE,每个表都有个对应的ROWNUM,等于是自增ID,不过,只是加1的,删了记录也是每条加1
然后用这种方法
select aa.*,abcnum from (select *,rownum abcnum from table where rownum<10) aa where abcnum>0
如果是SQL,可以以这样的语法
select * from table where rownum between 0 and 10
不过,SQL没有这么个ROWNUM的东西
所以只能用
m<n,取m和n之间范围的数
select top m from (select top n from table) aa
不要用ORDERY BY,也不要GROUP BY,多增个条件就会慢一点,不过,具体还要看你程序而写