夢(mèng)想飛翔

          自強(qiáng)不息
          posts - 111, comments - 30, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          rownum查詢

          看到一篇好文章,大家一起看看

          [轉(zhuǎn)貼]如何正確利用Rownum來限制查詢所返回的行數(shù)?
          軟件環(huán)境:
          1、Windows NT4.0+ORACLE 8.0.4
          2、ORACLE安裝路徑為:C:\ORANT

          含義解釋:
          1、rownum是oracle系統(tǒng)順序分配為從查詢返回的行的編號(hào),返回的第一行分配的是1,第二行是2,
            依此類推,這個(gè)偽字段可以用于限制查詢返回的總行數(shù)。
          2、rownum不能以任何基表的名稱作為前綴。
          使用方法:
          現(xiàn)有一個(gè)商品銷售表sale,表結(jié)構(gòu)為:
          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;(可以用在限制返回記錄條數(shù)的地方,保證不出錯(cuò),如:隱式游標(biāo))

          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是一個(gè)總是從1開始的偽列,Oracle 認(rèn)為這種條件不成立,查不到記錄)


          沒有查到記錄

          只返回前3條紀(jì)錄
          SQL> select rownum,month,sell from sale where rownum<4;

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


          如何用rownum實(shí)現(xiàn)大于、小于邏輯?(返回rownum在4—10之間的數(shù)據(jù))(minus操作,速度會(huì)受影響)
          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標(biāo)出正確序號(hào)(有小到大)
          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記錄.

          可以發(fā)現(xiàn),rownum并沒有實(shí)現(xiàn)我們的意圖,系統(tǒng)是按照記錄入庫(kù)時(shí)的順序給記錄排的號(hào),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標(biāo)出正確序號(hào)(有小到大)
          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記錄.

          利用以上方法,如在打印報(bào)表時(shí),想在查出的數(shù)據(jù)中自動(dòng)加上行號(hào),就可以利用rownum。

          返回第5—9條紀(jì)錄,按月份排序
          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

          主站蜘蛛池模板: 汶上县| 阿克| 绵阳市| 资阳市| 张家界市| 安徽省| 三都| 江孜县| 太仆寺旗| 壶关县| 松原市| 柘城县| 石城县| 东台市| 溧水县| 舒兰市| 杭州市| 景宁| 贡觉县| 北海市| 惠安县| 淮北市| 大埔区| 宾阳县| 玉环县| 武胜县| 肥城市| 二连浩特市| 德州市| 红桥区| 嘉黎县| 博白县| 武功县| 芜湖县| 社旗县| 县级市| 洛扎县| 阿坝县| 通城县| 察隅县| 若羌县|