使用 ROWID 查詢,刪除重復數據(Oracle)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM