如何正确利用Rownum来限制查询所返回的行数?

 

[精华] [转贴]如何正确利用Rownum来限制查询所返回的行数?


http://www.chinaunix.net 作者:Scott Howard发表于:2007-08-27 16:18:42
发表评论】【查看原文】【Oracle讨论区】【关闭】
<!-- 正文begin -->

如何正确利用Rownum来限制查询所返回的行数?
软件环境:
1、WindowsNT4.0+ORACLE8.0.4
2、ORACLE安装路径为:C:\ORANT

含义解释:
1、rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,
 依此类推,这个伪字段可以用于限制查询返回的总行数。
2、rownum不能以任何基表的名称作为前缀。
使用方法:
现有一个商品销售表sale,表结构为:
month   char(6)     --月份
sell    number(10,2)   --月销售金额

createtablesale(monthchar(6),sellnumber);
insertintosalevalues('200001',1000);
insertintosalevalues('200002',1100);
insertintosalevalues('200003',1200);
insertintosalevalues('200004',1300);
insertintosalevalues('200005',1400);
insertintosalevalues('200006',1500);
insertintosalevalues('200007',1600);
insertintosalevalues('200101',1100);
insertintosalevalues('200202',1200);
insertintosalevalues('200301',1300);
insertintosalevalues('200008',1000);
commit;

SQL>;selectrownum,month,sellfromsalewhererownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)

ROWNUMMONTHSELL
------------------------
12000011000

SQL>;selectrownum,month,sellfromsalewhererownum=2;(1以上都查不到记录)

没有查到记录

SQL>;selectrownum,month,sellfromsalewhererownum>;5;
(由于rownum是一个总是从1开始的伪列,Oracle认为这种条件不成立,查不到记录)


没有查到记录

只返回前3条纪录
SQL>;selectrownum,month,sellfromsalewhererownum<4;

ROWNUMMONTHSELL
------------------------
12000011000
22000021100
32000031200


如何用rownum实现大于、小于逻辑?(返回rownum在4—10之间的数据)(minus操作,速度会受影响)
SQL>;selectrownum,month,sellfromsalewhererownum<10
2minus
3selectrownum,month,sellfromsalewhererownum<5;

ROWNUMMONTHSELL
------------------------
52000051400
62000061500
72000071600
82001011100
92002021200

想按日期排序,并且用rownum标出正确序号(有小到大)
SQL>;selectrownum,month,sellfromsaleorderbymonth;

ROWNUMMONTHSELL
------------------------
12000011000
22000021100
32000031200
42000041300
52000051400
62000061500
72000071600
112000081000
82001011100
92002021200
102003011300

查询到11记录.

可以发现,rownum并没有实现我们的意图,系统是按照记录入库时的顺序给记录排的号,rowid也是顺序分配的

SQL>;selectrowid,rownum,month,sellfromsaleorderbyrowid;

ROWIDROWNUMMONTHSELL
------------------------------------------
000000E4.0000.000212000011000
000000E4.0001.000222000021100
000000E4.0002.000232000031200
000000E4.0003.000242000041300
000000E4.0004.000252000051400
000000E4.0005.000262000061500
000000E4.0006.000272000071600
000000E4.0007.000282001011100
000000E4.0008.000292002021200
000000E4.0009.0002102003011300
000000E4.000A.0002112000081000

查询到11记录.

正确用法,使用子查询
SQL>;selectrownum,month,sellfrom(selectmonth,sellfromsalegroupbymonth,sell)whererownum<13;

ROWNUMMONTHSELL
------------------------
12000011000
22000021100
32000031200
42000041300
52000051400
62000061500
72000071600
82000081000
92001011100
102002021200
112003011300

按销售金额排序,并且用rownum标出正确序号(有小到大)
SQL>;selectrownum,month,sellfrom(selectsell,monthfromsalegroupbysell,month)whererownum<13;

ROWNUMMONTHSELL
------------------------
12000011000
22000081000
32000021100
42001011100
52000031200
62002021200
72000041300
82003011300
92000051400
102000061500
112000071600

查询到11记录.

利用以上方法,如在打印报表时,想在查出的数据中自动加上行号,就可以利用rownum。

返回第5—9条纪录,按月份排序
SQL>;select*from(selectrownumrow_id,month,sell
2from(selectmonth,sellfromsalegroupbymonth,sell))
3whererow_idbetween5and9;

ROW_IDMONTHSELL
--------------------------
52000051400
62000061500
72000071600
82000081000
92001011100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值