1. 程式人生 > >oracle取前幾行|中間幾行|後幾行

oracle取前幾行|中間幾行|後幾行

oracle中取指定行是利用一個引數rownum,例如,取前10行資料的程式碼就是:

select * from tablea where rownum < 10

那麼取中間幾行是不是就把rownum < 10改為rownum > 10 and rownum < 20呢?

嘗試執行,會發現有異常!!!!然後,我們就需要學習rownum 的真正含義,以及如何使用了。

先好好理解 rownum 的意義吧。因為ROWNUM是對結果集加的一個偽列,即先查到結果集之後再加上去的一個列 (強調:先要有結果集)。簡單的說 rownum 是對符合條件結果的序列號。它總是從1開始排起的。所以你選出的結果不可能沒有1,而有其他大於1的值。所以沒辦法期望得到下面的結果集:

11 aaaaaaaa
12 bbbbbbb
13 ccccccc
.................

rownum >10 沒有記錄,因為第一條不滿足去掉的話,第二條的rownum又成了1,所以永遠沒有滿足條件的記錄。或者可以這樣理解:rownum是一個序列,是oracle資料庫從資料檔案或緩衝區中讀取資料的順序。它取得第一條記錄則rownum值為1,第二條為2,依次類 推。如果你用>,>=,=,between...and這些條件,因為從緩衝區或資料檔案中得到的第一條記錄的rownum為1,則被刪除, 接著取下條,可是它的rownum還是1,又被刪除,依次類推,便沒有了資料。

任何時候想把 rownum = 1 這條記錄拋棄是不對的,它在結果集中是不可或缺的,少了rownum=1 就像空中樓閣一般不能存在,所以你的 rownum 條件要包含到 1.

如果就是想要用 rownum > 10 這種條件的話,就要用巢狀語句,把 rownum 先生成,然後對他進行查詢。
select * from (select rownum as rn,t1.* from tablea t1 where ...) tab where tab.rn >10

類似的如果想要取中間幾行資料的話,sql語句就應該這麼寫:select * from (selet rownum as rn,t1.* from tablea t1 where ...) tab where tab.rn >10 and tab.rn < 20

 參考文章:https://www.cnblogs.com/szlbm/p/5806070.html