查询表中第X到第Y表数据方法

sql2000

 

select t.* from test t
inner join
(select (select count(*) from test t2 where t1.id >= t2.id) rowid, t1.id from test t1
)
as a
on a.id = t.id and a.rowid between @from and @to

 

sql2005

 

select t.* from test t
inner join
 ( select row_number() over (order by id) as rowId, id from test ) as a
on a.id = t.id and a.rowid between @from and @to

 参考:

ROW_NUMBER()是MS SQL Server 2005中新增窗口函数,可用来直接生成行号。如:
select ROW_NUMBER() over (order by ENo), ENo,EName
from Employee


但是SQL Server 2000中是没有这个函数的,那除了迁移数据库版本外,有没有替代的解决方法呢?答案是肯定的。
有两个思路


1、使用临时表。
如果是在存储过程中,这是一个不错的选择。
创建一个临时表,其中除了需要的查询结果外,还一个记数列。查询结果放入临时表后(一般情况下可直接使用Insert into语句),用代码进行记数,更新记数列的值。
在记数列数值的生成方法上,还有一个改进的办法是直接将该列定义为自增长字段。这样“记数”的代码也省掉了。

2、采用自连接。
如果是在代码中,不便于使用临时表,可以采用此方法。比如执行一个查询统计,需要一个替代的SQL语句。
这个方法实际上是通过表的自连接给结果行“分等级”的思路来实现的。
语句如下:
select count(*),e1.ENo, e1.EName
from Employee e1
inner join Employee e2 on e1.ENo >= e2.ENo
group by e1.ENo, e1.EName
order by 1 

或者把join条件放到where子句中:
select count(*),e1.ENo, e1.EName
from Employee e1, Employee e2,
where e1.ENo >= e2.ENo
group by e1.ENo, e1.EName
order by 1

如果ENo字段值不重复,还可以这样写:
select (select count(*) from Employee e2 where e1.ENo >= e2.ENo), e1.ENo, e1.EName
from Employee e1
order by 1

如果ENo字段值有重复的情况,要使用最后一种写法可以将where条件变通一下,如:
where e1.ENo+e1.EName >= e2.ENo+e2.EName
总能找到不存在重复值的表达式的。

文章出处:DIY部落(http://www.diybl.com/course/7_databases/database_other/20090207/154905.html)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值