1. 程式人生 > >Oracle中的rownum 和rowid的用法和區別

Oracle中的rownum 和rowid的用法和區別

hashcode 去重 pre weight row 動態 自己 log gpo

1.rownum是偽列,是在獲取查詢結果集後再加上去的 (獲取一條記錄加一個rownum)。對符合條件的結果添加一個從1開始的序列號。

eg:

select rownum,phone_no from ur_user_info where rownum < 6;

attention:

  rownum是動態的,必有查詢結果,然後再給查詢的結果集添加上這個列。 例如:第一條記錄的rownum是1 ,第二條是2,以此類推。

select rownum, phone_no from ur_user_info where rownum > 5 and rownum <
10; ---查詢結果為空集

當產生結果集時,oracle會產生一條rownum為1的記錄,顯然不符合條件;那麽就會產生第二條記錄,同樣rownum=1,也不符合記錄; 一直下去,導致最後上述sql產生的結果集時空集。

如果需要查詢到結果,需要使用子查詢:

select rownum, phone_no
  from (select rownum, phone_no from ur_user_info) a
 where a.rownum > 5
   and a.rownum < 10;

2.rowId偽列

rowid是物理存在的,實際存在的一個列,是一種數據類型。 基於64為編碼的18個字符來唯一標識的一條記錄的物理位置的一個ID。

唯一標識出對應的存儲的物理位置, 類似hashcode值。

attention:rowid並未存儲在表中,所以不支持增刪改操作,只能用戶查詢。

select row_id ,phone_no from ur_user_info where rowid > 5 and rowid < 10;

實際應用場景:數據去重--當多條記錄主鍵相同或者多條記錄完全一致時,只需要留下一條記錄。(賬單表中出現多條一樣的數據)

delete from bal_acctbook_info
 where rowid not in (select min(rowid)
                       
from bal_acctbook_info where balance_id = 4012562452 and op_time = 20171212111111);

-----明天上線,給自己買了一份重大疾病保險,但願一切平安。

Oracle中的rownum 和rowid的用法和區別