王三

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

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

          主站蜘蛛池模板: 泰兴市| 巴彦淖尔市| 马公市| 来安县| 襄城县| 磐石市| 依兰县| 祁东县| 尚志市| 仙桃市| 阿合奇县| 大荔县| 北川| 辛集市| 鹤庆县| 通渭县| 阳城县| 兴安盟| 连平县| 临汾市| 交城县| 柳林县| 塔城市| 将乐县| 彭山县| 乐山市| 乌鲁木齐县| 武汉市| 泗阳县| 大渡口区| 仲巴县| 仁化县| 都昌县| 佛教| 沂水县| 罗山县| 伽师县| 涪陵区| 宣汉县| 越西县| 吉林省|