使用 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

 

posted @ 2021-12-16 14:16  越过那个限制  阅读(1517)  评论(0编辑  收藏  举报