SQL的颁布就麻烦一些:查询第X页,每页Y条记录最基本的处理方法(原理):如果表中有主键(记录不重复的字段也可以),可以用类似下面的方法,当然y,(x-1)*y要换成具体的数字,不能用变量:select top y * from 表 where 主键 not in(select top (x-1)*y 主键 from 表)如果表中无主键,可以用临时表,加标识字段解决.这里的x,y可以用变量.select id=identity(int,1,1),* into #tb from 表
select * from #tb where id between (x-1)*y and x*y-1
select * from #tb where id between (x-1)*y and x*y-1
解决方案 »
- 怎么查看SQL最近的操作日志(知道)
- 求sql 选出逾期未登录的会员。
- 一个简单的ASP连接数据库出错的问题请教
- 如何访问SQL Server底层的机制
- 引碧血剑的异构数据库之间用SQL语句转换 SQL Server 转 Excel加入条件....where 更深一点。详...
- 删除表中重复记录的问题
- 如何查询数据库中是否有和给定的一个值相等的记录?
- 中文SQL Server 2000中的表导入到日文SQL Server 2000中有乱码!
- 请教第一次初始化informix 出错的解决办法
- 前面日期的问题,两位年是DATEADD返回的值
- 一段很变态的sql实现,我还没有实现,等高手帮忙
- dts导入数据的问题
我今天专门试过这种方法
一共做了1千万条数据
select top 20 * from a where id not in(select top 9000000 id from a)
这样,我的机器p4 2G 512M 还是要12秒的
越到后面,数据量越大,不是就越慢?
(其中就两个字段ID是主建,还有一个Name)
还有好方法不?
/*--利用SQL未公开的存储过程实现分页
方法简单且效率高,已知的问题就是要多返回一个空的记录集 解决的方法是在前台调用时,用 set recordset=recordset.nextrecordset
的方法跳过第一个记录集
此方法由J9988提供,我只是将它改成了方便调用的存储过程--邹建 2004.05(引用请保留此信息)--*//*--调用示例
exec p_splitpage 'select id,name from sysobjects where xtype=''U'' order by id',1,5
--*/
create procedure p_splitpage
@sql nvarchar(4000), --要执行的sql语句
@currentpage int=2, --要显示的页码
@pagesize int=10, --每页的大小
@pagecount int=0 out --总页数
as
set nocount on
declare @p1 intexec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount outputselect @pagecount=ceiling(1.0*@pagecount/@pagesize)
,@currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @p1,16,@currentpage,@pagesize
exec sp_cursorclose @p1
go
你的那个sql server的内部的存储过程
我试过了
竟然要创建好大一个tempdb
不知道,你测试过没有?
说不定,是我测试的方法不对
select top y * from 表 a RIGHT OUTER JOIN (select top (x-1)*y 主键 from 表 b)
on A.主键=B.主键 where A.主键 is null