王三

          終日乾乾
          posts - 1, comments - 0, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2012年8月23日

          1>:oracle中帶排序的分頁sql,至少包含三層,若無order by可以兩層,通用模板為(hibernate也是采用這種方法):

              select temp2.* from(
                  select rownum num,temp1.* from(
                         SQL查詢
                 ) temp1 where rownum<=?
             )temp2 where temp2.num>?

              如果是第一頁的分頁,可以簡化為兩層:

              select * from(
                  SQL查詢
              ) where rownum <=?

          2>:有些特性需要注意:

              a:最內層的sql查詢中的order by項一定要保證記錄的唯一性,否則,若排序字段有重復記錄,則分頁查詢后,翻頁后數(shù)據(jù)會出現(xiàn)重復和缺少,因為oracle沒有默認排序一說,mysql的會按主鍵自然排序(?待確認),導致兩次分頁查詢的order by結果不一致,哎,這樣查詢時非冪等的。
              b:rownum是個很蛋疼的偽列,它的對滿足查詢條件(不包括“含有rownum的查詢條件”和“排序條件”)的結果集的順序記錄,并且在生成結果集時逐一遞增,也就是發(fā)現(xiàn)對滿足查詢條件(不包括“含有rownum的查詢條件”和“排序條件”) 的第一條記錄,rownum附加為記錄上并賦值為(當前結果集的總數(shù)+1)1,然后若有rownum查詢條件,則使用rownum查詢條件來判斷,若符合則繼續(xù)查詢,否則舍棄記錄,然后接著查詢,以此推之,那么rownum一定從1開始,所以對<、<=可以很好支持,對!=可以像<一樣詭異支持,對其他的=、>、>=、between...and不為1的不支持了。
              c:上面說rownum的賦值是在orderby前面的,所以若要利用好orderby,就必須使用子查詢,將orderby語句放在內層無rownum的語句中。

          posted @ 2012-08-23 14:37 王三 閱讀(153) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 博兴县| 天全县| 岑溪市| 汉阴县| 黄陵县| 鄂尔多斯市| 高州市| 陈巴尔虎旗| 璧山县| 曲沃县| 嘉兴市| 漯河市| 凤凰县| 丹棱县| 元江| 杭州市| 滦平县| 泾源县| 思茅市| 开封市| 广宗县| 凤冈县| 浙江省| 澳门| 克拉玛依市| 仙桃市| 达拉特旗| 阿图什市| 石棉县| 藁城市| 高要市| 馆陶县| 博爱县| 武功县| 太仆寺旗| 桂林市| 花莲市| 永和县| 常熟市| 南康市| 沅江市|