Oracle中的rownum 和rowid的用法和區別
阿新 • • 發佈:2017-12-11
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的用法和區別