删除表中重复的行数据
发布日期:2021-05-09 05:10:02 浏览次数:24 分类:博客文章

本文共 1243 字,大约阅读时间需要 4 分钟。

#如下测试表b,如何删除重复值字段:

SQL> select * from b1; 

ID NAME

---------- ----------         

1 a         

1 a         

1 b         

2 a

1 a

2 a

 

#小结:重复值多:则重建表更好、 重复值少,表大,则delete更好

 

#方法一:

group by 分组,找到有效数据,创建一个新表,数据插入,随后删除原表,随后rename 该名称:

SQL> create table b2 as select * from b1 group by id,name;

SQL> select * from b2;

  1 a          1 b          2 a

SQL> drop table b1 purge;

SQL> alter table b2 rename to b1;

 

#方法二:

找出不符合规则的数据,delete删除

SQL> select rowid,id,name from b1 where (id,name) in(select id,name from b1 having(count(*))>1 group by id,name);

 

ROWID                      ID NAME

------------------ ---------- ----------
AAAV3EAAEAAAAKTAAA          1 a
AAAV3EAAEAAAAKTAAB          1 a
AAAV3EAAEAAAAKTAAD          2 a
AAAV3EAAEAAAAKWAAE          1 a
AAAV3EAAEAAAAKWAAF          2 a

 

#本想通过rownum,最后还是选择rowid  唯一

#查询符合条件的ROWID:重复行数据中,最小的rowid的value

SQL> select min(rowid) from b1 group by id,name having(count(*))>1;

MIN(ROWID) ------------------

AAAV3EAAEAAAAKTAAA

AAAV3EAAEAAAAKTAAD

 

#删除语法:因为如果表没有任何列是唯一的,那么最好直接使用rowid,稳定唯一:

找到所有重复记录的value, 排除重复记录中,最小的rowid 保留一行

SQL>  delete from b1

where rowid in

(select rowid from b1 where (id,name)

         in(select id,name from b1 having(count(*))>1 group by id,name))

and rowid not in

(select min(rowid) from b1 having(count(*))>1 group by id,name);

 

3 rows deleted.

 

SQL> select * from b1;

        ID NAME ---------- ----------        

  1 a          1 b          2 a

SQL> commit;

 

上一篇:Oracle text组件安装
下一篇:字段从varchar2修改为number,字段中的内容做修改,替换

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月24日 21时36分35秒