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

转载 2007年10月08日 17:05:00
1rownumoracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2
  依此类推,这个伪字段可以用于限制查询返回的总行数。

2
rownum不能以任何基表的名称作为前缀。
 
使用方法:
 
现有一个商品销售表sale,表结构为:

month
    char(6)      --月份

sell
    number(10,2)   --月销售金额


create table sale (month char(6),sell number);
insert into sale values('200001',1000);
insert into sale values('200002',1100);
insert into sale values('200003',1200);
insert into sale values('200004',1300);
insert into sale values('200005',1400);
insert into sale values('200006',1500);
insert into sale values('200007',1600);
insert into sale values('200101',1100);
insert into sale values('200202',1200);
insert into sale values('200301',1300);
insert into sale values('200008',1000);
commit;

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


   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000

SQL>; select rownum,month,sell from sale where rownum=2;
1以上都查不到记录)


没有查到记录


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



没有查到记录


只返回前3条纪录

SQL>; select rownum,month,sell from sale where rownum<4;

   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000
        2 200002      1100
        3 200003      1200


如何用rownum实现大于、小于逻辑?(返回rownum4—10之间的数据)(minus操作,速度会受影响)

SQL>; select rownum,month,sell from sale where rownum<10
  2  minus
  3  select rownum,month,sell from sale where rownum<5;

   ROWNUM MONTH       SELL
--------- ------ ---------
        5 200005      1400
        6 200006      1500
        7 200007      1600
        8 200101      1100
        9 200202      1200

想按日期排序,并且用rownum标出正确序号(有小到大)

SQL>; select rownum,month,sell from sale order by month;

   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000
        2 200002      1100
        3 200003      1200
        4 200004      1300
        5 200005      1400
        6 200006      1500
        7 200007      1600
       11 200008      1000
        8 200101      1100
        9 200202      1200
       10 200301      1300

查询到11记录
.

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


SQL>; select rowid,rownum,month,sell from sale order by rowid;

ROWID                 ROWNUM MONTH       SELL
------------------ --------- ------ ---------
000000E4.0000.0002         1 200001      1000
000000E4.0001.0002         2 200002      1100
000000E4.0002.0002         3 200003      1200
000000E4.0003.0002         4 200004      1300
000000E4.0004.0002         5 200005      1400
000000E4.0005.0002         6 200006      1500
000000E4.0006.0002         7 200007      1600
000000E4.0007.0002         8 200101      1100
000000E4.0008.0002         9 200202      1200
000000E4.0009.0002        10 200301      1300
000000E4.000A.0002        11 200008      1000

查询到11记录
.

正确用法,使用子查询

SQL>; select rownum,month,sell from (select month,sell from sale group by month,sell) where rownum<13;

   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000
        2 200002      1100
        3 200003      1200
        4 200004      1300
        5 200005      1400
        6 200006      1500
        7 200007      1600
        8 200008      1000
        9 200101      1100
       10 200202      1200
       11 200301      1300

按销售金额排序,并且用rownum标出正确序号(有小到大)

SQL>; select rownum,month,sell from (select sell,month from sale group by sell,month) where rownum<13;

   ROWNUM MONTH       SELL
--------- ------ ---------
        1 200001      1000
        2 200008      1000
        3 200002      1100
        4 200101      1100
        5 200003      1200
        6 200202      1200
        7 200004      1300
        8 200301      1300
        9 200005      1400
       10 200006      1500
       11 200007      1600

查询到11记录
.

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


返回第5—9条纪录,按月份排序

SQL>; select * from (select rownum row_id ,month,sell 
  2  from (select month,sell from sale group by month,sell)) 
  3  where row_id between 5 and 9;

    ROW_ID MONTH        SELL
---------- ------ ----------
         5 200005       1400
         6 200006       1500
         7 200007       1600
         8 200008       1000
         9 200101       1100
 

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

rownum查詢 看到一篇好文章,大家一起看看[转贴]如何正确利用Rownum来限制查询所返回的行数? 软件环境: 1、Windows NT4.0+ORACLE 8.0.4 2、ORACLE安装路径为...
  • henanhorse
  • henanhorse
  • 2004-08-12 19:42:00
  • 1504

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

今天在用ORACLE的ROWNUM进行分页时遇到了一个问题,通过GOOGLE找了如下文,现在转贴过来,以便以后用。以下为原文:-------------------------------------...
  • jinghui_cn
  • jinghui_cn
  • 2007-04-03 17:40:00
  • 413

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

如何正确利用Rownum来限制查询所返回的行数? 1、rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,   依此类推,这个伪字段可以用于限制查询返回的...
  • fengyang2
  • fengyang2
  • 2011-03-29 10:16:00
  • 141

利用Rownum限制查询所返回的行数

本文通过个人经验来客观的讲述如何利用Rownum来限制查询所返回的行数。 软件环境:  1、Windows NT4.0+ORACLE 8.0.4。 2、ORACLE安装路径为:C:/ORANT。 含义...
  • BubbleKitty
  • BubbleKitty
  • 2011-04-21 10:14:00
  • 326

如何利用rownum限制查询返回的行数

Rownum伪例使用的限制:SQL>; select rownum,month,sell from sale where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)...
  • guqiting
  • guqiting
  • 2010-05-17 13:25:00
  • 235

sqlite 取得结果集行号的方法

这几天遇到了一个问题,使用sqlite怎样取得结果集的行号? sqlite中无法使用ROWNUM(),有的网友建议使用rowid。但rowid记录的是原表中的行号,并不是查询结果集的行号。 在网上...
  • chengnan5603
  • chengnan5603
  • 2016-02-18 13:33:38
  • 2180

MySQL查询获取行号rownum

MySQL中可以使用变量产生行号,下面是2个简单例子: 使用工具:MySQL Workbench 说明:表heyf_10中字段,empid(员工工号)、deptid(部门编号)、salary(薪资...
  • zht666
  • zht666
  • 2013-04-26 15:25:45
  • 26242

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

软件环境:   1、Windows NT4.0+ORACLE 8.0.4  2、ORACLE安装路径为:C:\ORANT  含义解释:   1、rownum是oracle系统顺序分配为从查...
  • zhongshaoguo
  • zhongshaoguo
  • 2013-12-26 17:03:01
  • 476

DB2 限制结果集返回的行数

DB2里限制SQL语句返回的行数需要加入子句: fetch first n rows only 则此查询只返回n行数据...
  • smh821025
  • smh821025
  • 2009-05-18 12:53:00
  • 1999

oracle限制查询条数-rownum用法详解

对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。...
  • qq_26222859
  • qq_26222859
  • 2017-06-09 14:52:03
  • 1370
收藏助手
不良信息举报
您举报文章:如何正确利用Rownum来限制查询所返回的行数
举报原因:
原因补充:

(最多只允许输入30个字)