<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
    rownum偽劣的相關(guān)問題
    ?
    ?
    1、在SQL中使用rownum的限制:
    ?

    ??? select * from t1 where rownum >= 1 ;

    ??? select * from t1 where rownum >= 2 ;

    ???????????對于上面兩個SQL來說,第一個可以返回所有記錄,第2個SQL返回0條記錄;
    ?????????? 原因是Oracle掃描第1條記錄時,因為不滿足而無法輸出,因此rownum序列重新置0,然后永遠因無法滿足條件而不能輸出,最終返回0條記錄。包括rownum=2也由于此原因不能得到記錄。
    ?
    ?????????? 所以當需要rownum >= n 時,需要先把rownum轉(zhuǎn)化為實列,例如:

    ??? select num from

    ??? ( select num, rownum? rn fromt1)

    ??? where rn >= 10 ;

    ?

    ?

    ??? 另外,rownum列不能加任何基表的前綴,例如:

    ??? select id,t1.rownum from t1;? --ORA-01747: invalid user.table.column specification

    ?

    ?

    2、對表排序,再取出第i到第j條記錄:

    ?

    ??? select * from

    ??? ( select num, rownum rn from

    ??? ( select num from t1 order by id ))

    ??? where rn between 5 and 10 ;

    ?

    ?????注意:千萬不能使用以下方法

    ??? select * from

    ??? (select num from t1 order by id)

    ??? where rownum <= 10

    ??? minus

    ??? select * from

    ??? (select num from t1 order by id)

    ??? where rownum <= 4 ; ----會發(fā)生錯誤,因為minus自動distinct

    ?

    ?

    3、order? by的一些特性:

    ?

    ??? (select * from t1);

    ??? select * from t1 order by id;

    ??? (select * from t1 order by id);--發(fā)生錯誤ORA-00907: missing right parenthesis

    ??? (select * from t1 )order by id;

    ??? select * from (select * from t1 order by id);

    ?????其中除第3個外,其余均可正確執(zhí)行,主要是由于Oracle的解析規(guī)則造成,修改成第4種方式即可。

    ?

    ?

    4、一條關(guān)于rownum語句的問題:

    ?

    ??? select * from t1 where rownum <= 10 order by id desc;

    ??? select * from t1 where rownum <= 10 order by num desc;

    ?????比較上面兩條語句,唯一的區(qū)別是id字段上有索引,num字段沒有索引

    ?

    ????乍一看這兩條語句都會先進行篩選rownum <= 10 然后再排序,則得出的結(jié)果集應該是相同的10行記錄

    ????但是實際上兩條語句運行出來的結(jié)果是完全不同的

    ????主要的原因還是由于RBO會判斷排序字段是否有索引,如果存在索引,就先排序,然后進行rownum篩選,如果字段無索引則先進行篩選再排序。

    ?

    ?

    5、標準SQL函數(shù)row_number() over()的用法:

    ?

    ??? select id,num,row_number() over(partition by id order by num) from t1;

    ????即對id分組后,再按照num的排列順序取出一次的row_number

    ????在實際應用中可以取出例如:每個班的最后10名的成績,每個月最大的20比交易等等。

    ?

    ?

    6、使用rownum提取依次的序列:

    ?

    ???? 這是一個比較基本的應用了:

    ??? select rownum from dual connect by rownum<=10;

    ?????????? 把rownum換成level的效果也是一樣:

    ??? select level from dual connect by level<=10;

    ?

    ?????這個在實際的應用還是比較廣泛的,例如:列出當月的所有天數(shù)

    ??? select trunc(sysdate,'mm')+rownum-1 as everyday from dual

    ??? connect by rownum <= to_number(to_char(last_day(sysdate),'dd'));

    ?

    ?





    -The End-

    posted on 2008-08-14 17:58 decode360-3 閱讀(529) 評論(0)  編輯  收藏 所屬分類: SQL Dev
    主站蜘蛛池模板: 亚洲AV性色在线观看| 男女免费观看在线爽爽爽视频| 亚洲偷偷自拍高清| 亚洲乱码中文字幕综合| 日韩特黄特色大片免费视频| 日韩在线永久免费播放| 免费一级毛suv好看的国产网站 | 老子影院午夜伦不卡亚洲| 亚洲视频在线观看不卡| 亚洲精品色午夜无码专区日韩| 午夜一区二区免费视频| 日韩国产免费一区二区三区| AAA日本高清在线播放免费观看| 在线观看国产一区亚洲bd| 亚洲人配人种jizz| 亚洲色图在线观看| 国产亚洲婷婷香蕉久久精品 | 直接进入免费看黄的网站| 亚洲AV无码一区二区三区人| 亚洲日本中文字幕区| 亚洲精品无码专区在线在线播放 | 在线综合亚洲欧洲综合网站| 亚洲福利一区二区精品秒拍| 亚洲AV永久无码精品一百度影院| 亚洲天堂在线视频| 亚洲人成色77777在线观看大 | 一道本不卡免费视频| 美女被吸屁股免费网站| 婷婷亚洲综合五月天小说在线| 亚洲AV无码成人精品区狼人影院| 亚洲一区二区三区丝袜| 亚洲伊人久久大香线蕉AV| 亚洲精品无码久久久久牙蜜区| 亚洲人成网站免费播放| 亚洲人成网站在线在线观看| 亚洲第一街区偷拍街拍| 亚洲av无码专区在线观看亚| 亚洲AV无码专区在线观看成人| 蜜桃传媒一区二区亚洲AV| 美女隐私免费视频看| 一级白嫩美女毛片免费|