1. 程式人生 > >ROWNUM如何獲取前N條記錄,以及ROWNUM的都有哪些坑???

ROWNUM如何獲取前N條記錄,以及ROWNUM的都有哪些坑???

 

場景:獲取待處理表按時間排序後前N條待處理記錄

錯誤寫法:select * from table_name where status = '0' and rownum <= 100 order by upd_time; --滿足條件的記錄取前100條後結束掃描,在排序這個結果集,功能未能實現;

正確寫法:select * from (select * from table_name where status = '0' order by upd_time) where rownum <= 100; --獲取滿足條件的結果集,在排序,在取前100條記錄

ROWNUM使用的幾個注意點:

對於ORACLE的rownum問題,

假設表 t1(c1) 中有20條記錄,

select rownum, c1 from t1 where rownum > 10;(如果你寫下這個SQL,在你的頭腦中因該是想得到表中後10條記錄),執行SQL後顯示出的結果會令你失望,也許您可能會懷疑有人刪掉了後面的10條記錄,然後檢視記錄數仍為 20 條?那問題出在哪裡啊???

先好好理解rownum的意義吧,rownum是結果集的一個偽列,既先查到一個結果集之後,再加上的一個列 rownum(偽列),(強調:先結果集),簡單的說,就是對符合條件結果集的序號,它總是從1開始排起的,所以你選出的結果集不可能沒有1。

rownum > 10沒記錄,因為第一條記錄不滿的rownum = 1,不滿足條件,第二條及記錄的rownum又變成了1,所以永遠沒有滿足條件的記錄;

所以您沒辦法得到期望的下面的結果集

11 aaaaaa

12 bbbbbb

13 cccccc

................

瞭解了以上從不同方面建立的 rownum 概念之後,那我們來認識使用 rownum 的另外集中現象

1.select rownum, c1 from t1 where row_num != 10 為何返回的只有前 9 條記錄啊?,它與select rownum, c1 from t1 where rownum < 10

返回的結果集是相同的, 原因如下:rownum 為 9 後的記錄的 rownum 為10,因為條件 != 10,所以去掉rownum = 10 的記錄,想在rownum 仍為 10,也去掉,繼續下去繼續這樣下去也就只剩下*前面 9 條記*錄了;

2.為什麼 rownum > 1 時查詢不到記錄,rownum > 0 或 rownum >= 1 時,確總顯示全部記錄?

因為rownum總是從1開始的(先結果集);

3.為什麼 between 1 and 10 或者 between 0 and 10 能查到結果集,而between 2 and 10卻得不到結果集的原因和上面一樣,因為rownum都是從1開始的。

但是如果要查 rownum > 10 的記錄,可以使用巢狀語句,rownum先生成,然後在對它進行查詢

select *

from (select rownum as num, t1.* from t1 where .....)

where num > 10;

 

另外:rowidrownum 雖都被稱為偽列,但他們的存在方式是不同的,rowid 可以說是物理存在的,表示記錄在表空間中的唯一位置 ID,在DB中唯一,只要記錄沒有被搬動過,rowid 是不變的,rowid 相對於表來說又象表中的一般列,所以一 rowid為條件的不會 發生 rownum 那些情況,

另外,還得注意,rownum 不能以任何基表的名稱作為字首