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

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

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

    Decode360's Blog

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

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    rownum偽劣的相關應用
    ?
    ?
    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轉化為實列,例如:

    ?

    ??? select num from

    ??? ( select num, rownum rn from t1)

    ??? where rn >= 10 ;

    ?

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

    ??? selectid,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 ;

    ?

    ??? 注意:使用minus來取可能出現問題,因為會自動distinct掉

    ??? select * from

    ??? (select num from t1 orderbyid)

    ??? whererownum <= 10

    ??? minus

    ??? select * from

    ??? (select num from t1 orderbyid)

    ??? whererownum <= 4 ; ----會發生錯誤,因為minus自動distinct

    ?

    ?

    3、order by的一些特性:

    ?

    ??? (select * from t1);

    ??? select * from t1 orderbyid;

    ??? (select * from t1 orderbyid);--發生錯誤ORA-00907: missing right parenthesis

    ??? (select * from t1 )orderbyid;

    ??? select * from (select * from t1 orderbyid);

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

    ?

    ?

    4、一條關于rownum語句的問題:

    ?

    ??? select * from t1 whererownum <= 10orderbyiddesc;

    ??? select * from t1 whererownum <= 10orderby num desc;

    ?

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

    ?

    ??? 乍一看這兩條語句都會先進行篩選rownum <= 10 然后再排序,則得出的結果集應該是相同的10行記錄,但是實際上兩條語句運行出來的結果是完全不同的。

    ?

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

    ?

    ?

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

    ?

    ??? selectid,num,row_number() over(partitionbyidorderby num) from t1;

    ?

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

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

    ?

    ?

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

    ?

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

    ??? selectrownumfrom dual connectbyrownum<=10;

    ?

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

    ??? selectlevelfrom dual connectbylevel<=10;

    ?

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

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

    ??? connectbyrownum <= to_number(to_char(last_day(sysdate),'dd'));

    ?

    ?

    ?
    posted on 2008-08-14 20:58 decode360 閱讀(208) 評論(0)  編輯  收藏 所屬分類: 05.SQL
    主站蜘蛛池模板: 国产一级高青免费| 无码国产精品一区二区免费3p | 亚洲成AV人在线观看天堂无码| 在线观看无码的免费网站| 8x成人永久免费视频| 国产在线98福利播放视频免费| 99爱在线观看免费完整版| 中国黄色免费网站| 免费看一级毛片在线观看精品视频| 亚洲三级在线免费观看| 亚洲精品亚洲人成在线麻豆| 亚洲国产精品VA在线观看麻豆| 久久精品国产亚洲AV不卡| 亚洲精品456播放| yy6080久久亚洲精品| 国内精品久久久久影院免费| 日本精品久久久久久久久免费 | 精品熟女少妇av免费久久| 国产成人AV免费观看| 中文字幕久无码免费久久| 国产精品高清免费网站 | 亚洲人成精品久久久久| 国产亚洲精品AA片在线观看不加载| 男人的天堂亚洲一区二区三区 | 免费网站观看WWW在线观看| 亚洲AV综合永久无码精品天堂| 亚洲va乱码一区二区三区| 在线免费观看亚洲| 亚洲高清资源在线观看| 久久精品a亚洲国产v高清不卡| 亚洲欧洲日韩不卡| 中文字幕在线观看亚洲| 亚洲精品福利网泷泽萝拉| 亚洲国产成人久久综合一区| 亚洲制服丝袜在线播放| 亚洲中文字幕日本无线码| 亚洲av日韩精品久久久久久a | 日韩成全视频观看免费观看高清| 免费观看的av毛片的网站| 国产又黄又爽又猛的免费视频播放 | 免费一区二区三区四区五区|