ORACLE 中ROWNUM用法總結!
對於 Oracle 的 rownum 問題很多資料都說不支持>>==between……and只能用以上符號(<<=!=)並非說用> >==between……and 時會提示SQL語法錯誤而是經常是查不出一條記錄來還會出現似乎是莫名其妙的結果來其實您只要理解好了這個 rownum 偽列的意義就不應該感到驚奇同樣是偽列rownum 與 rowid 可有些不一樣下面以例子說明
假設某個表 t(c) 有 條記錄
如果用 select rownumc from t where rownum < 只要是用小於號查出來的結果很容易地與一般理解在概念上能達成一致應該不會有任何疑問的
可如果用 select rownumc from t where rownum > (如果寫下這樣的查詢語句這時候在您的頭腦中應該是想得到表中後面條記錄)你就會發現顯示出來的結果要讓您失望了也許您還會懷疑是不誰刪了一些記錄然後查看記錄數仍然是 條啊?那問題是出在哪呢?
先好好理解 rownum 的意義吧因為ROWNUM是對結果集加的一個偽列即先查到結果集之後再加上去的一個列 (強調先要有結果集)簡單的說 rownum 是對符合條件結果的序列號它總是從開始排起的所以你選出的結果不可能沒有而有其他大於的值所以您沒辦法期望得到下面的結果集
aaaaaaaa
bbbbbbb
ccccccc
……
rownum > 沒有記錄因為第一條不滿足去掉的話第二條的ROWNUM又成了所以永遠沒有滿足條件的記錄或者可以這樣理解
ROWNUM是一個序列是oracle數據庫從數據文件或緩沖區中讀取數據的順序它取得第一條記錄則rownum值為第二條為依次類推如果你用>>==between……and這些條件因為從緩沖區或數據文件中得到的第一條記錄的rownum為則被刪除接著取下條可是它的rownum還是又被刪除依次類推便沒有了數據
有了以上從不同方面建立起來的對 rownum 的概念那我們可以來認識使用 rownum 的幾種現像
select rownumc from t where rownum != 為何是返回前條數據呢?它與 select rownumc from tablename where rownum < 返回的結果集是一樣的呢?
因為是在查詢到結果集後顯示完第 條記錄後之後的記錄也都是 != 或者 >=所以只顯示前面條記錄也可以這樣理解rownum 為後的記錄的 rownum為因條件為 !=所以去掉其後記錄補上rownum又是也去掉如果下去也就只會顯示前面條記錄了
為什麼 rownum > 時查不到一條記錄而 rownum > 或 rownum >= 卻總顯示所以的記錄
因為 rownum 是在查詢到的結果集後加上去的它總是從開始
為什麼 between and 或者 between and 能查到結果而用 between and 卻得不到結果
原因同上一樣因為 rownum 總是從 開始
從上可以看出任何時候想把 rownum = 這條記錄拋棄是不對的它在結果集中是不可或缺的少了rownum= 就像空中樓閣一般不能存在所以你的 rownum 條件要包含到
但如果就是想要用 rownum > 這種條件的話話就要用嵌套語句把 rownum 先生成然後對他進行查詢
select *
from (selet rownum as rnt* from a where ……)
where rn >
一般代碼中對結果集進行分頁就是這麼干的
另外rowid 與 rownum 雖都被稱為偽列但它們的存在方式是不一樣的rowid 可以說是物理存在的表示記錄在表空間中的唯一位置ID在DB中唯一只要記錄沒被搬動過rowid是不變的rowid 相對於表來說又像表中的一般列所以以 rowid 為條件就不會有 rownum那些情況發生
另外還要注意rownum不能以任何基表的名稱作為前綴
From:http://tw.wingwit.com/Article/program/Oracle/201311/17536.html