得到第20到第30条数据,有几种方法,每种10分,分不够再加!

cooolchen 2007-05-15 11:52:01
以id为pk,在一批id不连续的数据中得到第20条数据,或者得到第20到第30条数据,有几种方法可以实现,大家写写看!
...全文
704 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
hui_hui_2007 2007-05-18
  • 打赏
  • 举报
回复
不错.
gk1204boy 2007-05-17
  • 打赏
  • 举报
回复
学习中
crazyflower 2007-05-16
  • 打赏
  • 举报
回复
mark
windy8848 2007-05-16
  • 打赏
  • 举报
回复
学习ing
waysue 2007-05-16
  • 打赏
  • 举报
回复
mark
hui_hui_2007 2007-05-16
  • 打赏
  • 举报
回复
贴子不错,学习.
csbmm 2007-05-16
  • 打赏
  • 举报
回复
CSBMM()回答的 where...什么意思啊?

========================================

省略的地方根据需要写
horizon668 2007-05-16
  • 打赏
  • 举报
回复
CSBMM()回答的 where...什么意思啊?
csbmm 2007-05-16
  • 打赏
  • 举报
回复
select * from tablename
  where …
  and rownum<30
  minus
  select * from tablename
  where …
  and rownum<20
  order by name
CCjian 2007-05-16
  • 打赏
  • 举报
回复
楼上写得好...
lwl0606 2007-05-15
  • 打赏
  • 举报
回复
方法二
select * ,identity(int,1,1) as aa
into #aa
from table01

select * from #aa
where aa>=21 and aa<=30
lwl0606 2007-05-15
  • 打赏
  • 举报
回复
得到第20到第30条数据 :
方法一
select *
from table01
where id not in (select top 20 id from table01)
and id in (select top 30 id from table01)
方法
wgsasd311 2007-05-15
  • 打赏
  • 举报
回复
--第一种方法
--第21条到第30条,共选出10条记录
select *
from (select top 10 * from (select top 30 * from 表名 order by ID) t1 order by ID desc) t2
order by ID


--第二种方法
--第21条到第30条,共选出10条记录
select top 10 *
from 表名
where ID>(select max(ID) from (select top 20 ID from 表名 order by ID) t1)
order by ID
ojuju10 2007-05-15
  • 打赏
  • 举报
回复
--查询第20条记录:
select top 1 * from ( select top 20 * from t
order by id) aa
order by id desc
--查询第20条到第30条记录:
select * from ( select top 10 * from (select top 30 * from t order by id) aa
order by id desc) bb
order by id
leo_lesley 2007-05-15
  • 打赏
  • 举报
回复
------如果不安主键排序的情况
--用临时表
select c1=IDENTITY(int, 1,1),* into #lsb from 你的表名
--查询数据
select * from #lsb where c1 between 20 and 30


------如果按主键排序的情况

select *
from 你的表名
where id not in(select top 10 id from 你的表名 order by order_id )
order by order_id
刺客 2007-05-15
  • 打赏
  • 举报
回复
select * from
(select *, ROW_NUMBER() OVER (order by ID) AS ROWNUM from 表) #t
where ROWNUM between 21 and 30
OracleRoob 2007-05-15
  • 打赏
  • 举报
回复
--第一种方法
--第11条到第20条,共选出10条记录
select *
from (select top 10 * from (select top 20 * from 表名 order by ID) t1 order by ID desc) t2
order by ID


--第二种方法
--第11条到第20条,共选出10条记录
select top 10 *
from 表名
where ID>(select max(ID) from (select top 10 ID from 表名 order by ID) t1)
order by ID


gwallan 2007-05-15
  • 打赏
  • 举报
回复
mark
肥胖的柠檬 2007-05-15
  • 打赏
  • 举报
回复
-------------------------------------
分页方案一:(利用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 XiaoZhengGe
@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

----------------------------------------------------------------------------
declare @sqlstr nvarchar(4000), --查询字符串
@pagecount int, --第N页
@pagesize int --每页行数
select @pagecount=4 --第3页
,@pagesize=10 --第页10条
,@sqlstr='select * from TestTable'
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int

exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select @rowcount as 总行数,ceiling(1.0*@rowcount/@pagesize) as 页数,@pagecount as 当前页
set @pagecount=(@pagecount-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@pagecount,@pagesize
exec sp_cursorclose @P1




其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。
通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用
在实际情况中,要具体分析。
-狙击手- 2007-05-15
  • 打赏
  • 举报
回复
select c1=IDENTITY(int, 1,1),* into #tmp from tablename
select * from #tmp where c1 between 20 and 30
加载更多回复(4)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧