Oracle資料庫分頁

來源:互聯網
上載者:User

之前沒有接觸過Oracle資料庫,一直使用的都是MSSQL,說起這兩種資料庫的SQL語句,有很多地方都是不一樣的,具體的我也說不清促,大牛些比我更加清楚的。這裡我只是想寫一下關於在Oracle內如何?分頁的語句,便於後期自己查看。

開始在接觸到項目的時候,已經有同事做了頁面資料繫結的工作,當時是每重新整理頁面的時候將資料庫對應表內記錄全部查詢出來,然後通過PageSize來和當前頁來截取資料,綁定到頁面上。我看後覺得這樣效率太低了,資料量小的情況還是可以,但是一旦資料量上了十萬、百萬的,那樣讀取資料將會很慢。後來我果斷採用了資料庫分頁的形式,有一點覺得oracle很不錯的地方就是其內有著Rownum屬性,嘿嘿,這下可好了,避免了再次構造rownum的麻煩。

由於對oracle內的rownum不熟悉,前期搞了幾個笑話。我的想法如下:

select  *  from  tablename where rownum <=10 and rownum >= 1;  //能夠正確讀取資料

select  *  from tablename where rownum <=20 and rownum >= 10; //擷取不到任何資料,但是也不報錯

後來就開始尋找關於oracle內rownum屬性的相關資料,哎,原來rownum在插入記錄的時候就已經分配好了,而且對於沒有指定別名的情況下其索引值每次都得從1開始。www.bkjia.com 所以上面第二種情況下是擷取不到資料的。我們在寫SQL的時候避免不了有排序的要求,排序後如何能夠保證rownum也是遞增順序呢?

select * from tablename where rownum <= 10 and rownum >= 1 order by  ordername desc; //這樣擷取出來的rownum將不會連貫,後來查閱和嘗試可以在排序欄位內加入表的主鍵,那麼就會先排序,然後在在遞增方式賦予rownum。

重點說說分頁的SQL如下:

select * from (select rownum r ,t1.* from tablename t1 where rownum <EndRownum)

where r > StartRownum;

我也看到很多這樣的SQL語句:

select * from (select rownum r,t1.* from tablename t1)

where r<EndRownum and r > StartRownum;

我不得不說這種SQL的執行效率會很低的,內部SQL還是全表過濾了一遍的,太多就不說了。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.