rownum的问题

又是违规昵称 2008-12-19 03:48:59
分页中要用到rownum, 取50-100列,
发现sqlserver竟然没有这个东东

google了一下,有top方式解决的,
有用临时表伪列的方式,
大都是反复排序或嵌套,不知道效率怎么样

现在有下面两个问题:
1. 如果已经asc过的结果集,再嵌套一次来个desc,数据库是重新排序还是直接把行号计算一下?
2. 临时表的方式,需不需要额外的权限,对性能影响怎么样?建临时表再drop会不会引起事务提交?
3. 求一个高效的加伪列的sql

有比较好的办法的希望贴出来,谢谢
...全文
80 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
又是违规昵称 2008-12-19
  • 打赏
  • 举报
回复
谢谢,很全,
虽然1,2没有回答,但是3完全可以解决我的问题
相信2005推出rownum() over是高效的


to 4 楼:
一直行列不分,呵呵,谢谢了
中国风 2008-12-19
  • 打赏
  • 举报
回复
rownum--oracle排序函數

dawugui 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 lpc19598188 的帖子:]
分页中要用到rownum, 取50-100列,
发现sqlserver竟然没有这个东东

google了一下,有top方式解决的,
有用临时表伪列的方式,
大都是反复排序或嵌套,不知道效率怎么样

现在有下面两个问题:
1. 如果已经asc过的结果集,再嵌套一次来个desc,数据库是重新排序还是直接把行号计算一下?
2. 临时表的方式,需不需要额外的权限,对性能影响怎么样?建临时表再drop会不会引起事务提交?
3. 求一个高效的加伪列的s…
[/Quote]

--sql 2005
select * from
(
select * , px = row_number() over(order by id) from tb
) t where px between 50 and 100

--sql 2000
select * from
(
select * , px = (select count(1) from tb where id < t.id) from tb t
) m where px between 50 and 100
dawugui 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 lpc19598188 的帖子:]
分页中要用到rownum, 取50-100列,
发现sqlserver竟然没有这个东东

google了一下,有top方式解决的,
有用临时表伪列的方式,
大都是反复排序或嵌套,不知道效率怎么样

现在有下面两个问题:
1. 如果已经asc过的结果集,再嵌套一次来个desc,数据库是重新排序还是直接把行号计算一下?
2. 临时表的方式,需不需要额外的权限,对性能影响怎么样?建临时表再drop会不会引起事务提交?
3. 求一个高效的加伪列的s…
[/Quote]


取n到m条记录的语句

1.
select top m * from tablename where id not in (select top n id from tablename)

2.
select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入
set rowcount n
select * from 表变量 order by columnname desc

3.
select top n * from
(select top m * from tablename order by columnname) a
order by columnname desc


4.如果tablename里没有其他identity列,那么:
select identity(int) id0,* into #temp from tablename

取n到m条的语句为:
select * from #temp where id0 >=n and id0 <= m

如果你在执行select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行:
exec sp_dboption 你的DB名字,'select into/bulkcopy',true


5.如果表里有identity属性,那么简单:
select * from tablename where identitycol between n and m

如果是sql server 2005 可以这样写:
select top 20 * from T order col
except
select top 2 * from T order col



liangCK 2008-12-19
  • 打赏
  • 举报
回复
分页中要用到rownum, 取50-100列,

即使你用的数据库系统有rownum.那也是生成行号吧?..对列..rownum也没用吧?
水族杰纶 2008-12-19
  • 打赏
  • 举报
回复
--方法1:
--适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id NOT IN
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
)
ORDER BY id
--方法2:
--适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id >
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
) A
)
ORDER BY id
--方法3:
--适用于 SQL Server 2005
SELECT TOP 页大小 *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
) A
WHERE RowNumber > 页大小*(页数-1)
--方法四 适用于 SQL Server 2005
DECLARE @pagenum AS INT, @pagesize AS INT
SET @pagenum = 2
SET @pagesize = 3
SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum,
newsid, topic, ntime, hits
FROM news) AS D
WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize
ORDER BY newsid DESC
liangCK 2008-12-19
  • 打赏
  • 举报
回复
ROW_NUMBER()
SQL SERVER有这个东西..2005版本有..2000没有.
liangCK 2008-12-19
  • 打赏
  • 举报
回复
取n到m行

1.
select top m * from tablename where id not in (select top n id from tablename order by id asc/*|desc*/)

2.
select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入到临时表
set rowcount n --只取n条结果
select * from 表变量 order by columnname desc

3.
select top n * from
(select top m * from tablename order by columnname) a
order by columnname desc


4.如果tablename里没有其他identity列,那么:
先生成一个序列,存储在一临时表中.
select identity(int) id0,* into #temp from tablename

取n到m条的语句为:
select * from #temp where id0 > =n and id0 <= m

如果你在执行select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行:
exec sp_dboption 你的DB名字,'select into/bulkcopy',true


5.如果表里有identity属性,那么简单:
select * from tablename where identity_col between n and m

6.SQL2005开始.可以使用row_number() over()生成行号
;with cte as
(
select id0=row_number() over(order by id),* from tablename
)
select * from cte where id0 between n to m

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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