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