Oracle中的rowid
ROWID是ORACLE中的一個重要的概念。用於定位數據庫中一條記錄的一個相對唯一地址值。通常情況下,該值在該行數據插入到數據庫表時即被確定且唯一。ROWID它是一個偽列,它並不實際存在於表中。它是ORACLE在讀取表中數據行時,根據每一行數據的物理地址信息編碼而成的一個偽列。所以根據一行數據的ROWID能找到一行數據的物理地址信息。從而快速地定位到數據行。數據庫的大多數操作都是通過ROWID來完成的,而且使用ROWID來進行單記錄定位速度是最快的。
要理解索引,必須先搞清楚ROWID。
B-Tree索引的每個索引條目具有兩個字段。第一個字段表示索引的鍵值,對於單列索引來說是一個值;而對於多列索引來說則是多個值組合在一起的。第二個字段表示鍵值所對應的記錄行的ROWID。所以索引能加快查詢速度!
索引值→ROWID->將ROWID換算成一行數據的物理地址->得到一行數據
rowid采用64進制來編碼
編碼方法是:A~Z表示0到25;a~z表示26到51;0~9表示52到61;+表示62;/表示63;剛好64個字符。
傳送門: https://www.cnblogs.com/xqzt/p/4449184.html
搬磚分割線
————————————————————————————————————————————————————————————————————————————————————————————————————————————
具體解析:
--創建測試數據
create table test_EMP (EMP_NO varchar2(20) )
insert into test_EMP (EMP_NO) values ('1');
insert into test_EMP (EMP_NO) values ('1');
insert into test_EMP (EMP_NO) values ('GG1GG');
insert into test_EMP (EMP_NO) values ('GG1GG');
insert into test_EMP (EMP_NO) values ('2');
insert into test_EMP (EMP_NO) values ('G2G');
--思路:
--先查看rowid
select t.EMP_NO,rownum,rowid from test_EMP t
--根據重復字段分組,找出最大的rowid值
select t.EMP_NO,max(rowid) from test_EMP t group by t.EMP_NO;
--使用子查詢關聯查詢,找出比max(rowid)小的重復值
select b.EMP_NO, rowid from test_EMP b where rowid< (select max(rowid) from test_EMP where EMP_NO=b.EMP_NO);
--直接刪除那些重復的值,若數據量較大,建議通過臨時表來進行數據操作,也就是先保存不重復數據,再drop/create table,然后insert into
delete from test_EMP b where rowid< (select max(rowid) from test_EMP where EMP_NO=b.EMP_NO); --沒跑過,原理一樣
delete 數據篩選流程:
EMP_NO rownum 跑數據
1 AAFmXWAAcAAP+rvAAA form (f代替)這一行,子查詢內 select max(rowid) from test_EMP where EMP_NO='1',查出 AAFmXWAAcAAP+rvAAB ,外層 where rowid< (AAFmXWAAcAAP+rvAAB) ,於是刪除當前行
1 AAFmXWAAcAAP+rvAAB f 這一行,子查詢內 select max(rowid) from test_EMP where EMP_NO=‘1’,查出 AAFmXWAAcAAP+rvAAB ,外層 where rowid< (AAFmXWAAcAAP+rvAAB) ,於是保留數據
GG1GG AAFmXWAAcAAP+rvAAC
3 AAFmXWAAcAAP+rvAAF
2 AAFmXWAAcAAP+rvAAG
GG1GG AAFmXWAAcAAP+rvAAI
rowid 唯一字段的應用,在其他數據庫可以用其他的 唯一字段 代替
子查詢隱式分組 傳送門:https://blog.csdn.net/zhou920786312/article/details/72599547