夢想飛翔

          自強不息
          posts - 111, comments - 30, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          rownum查詢

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

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

          含義解釋:
          1、rownum是oracle系統順序分配為從查詢返回的行的編號,返回的第一行分配的是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實現大于、小于邏輯?(返回rownum在4—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

          主站蜘蛛池模板: 东兴市| 西峡县| 鸡泽县| 吉安市| 锡林郭勒盟| 如东县| 姚安县| 嘉鱼县| 秦安县| 永和县| 阿拉善盟| 黄浦区| 崇阳县| 仲巴县| 泸西县| 屯留县| 鄂伦春自治旗| 万年县| 颍上县| 于都县| 和林格尔县| 伊春市| 澳门| 甘谷县| 托克逊县| 平乐县| 望奎县| 萨嘎县| 洪洞县| 榕江县| 河北区| 宿松县| 堆龙德庆县| 定陶县| 罗定市| 股票| 娱乐| 襄垣县| 托克托县| 淳安县| 南京市|