分享好友 数据库首页 频道列表

Oracle 查找与删除表中重复记录的步骤方法

Oracle教程  2015-08-21 14:310

这时候如果临时表中有重复数据,无论是主键字段businessid有重复,还是一整行有重复都会报出违反唯一主键约束错误。

方法:group by XX having count(*)>1,rowid,distinct,temporary table,procedure

1、查询表中的重复数据
a.重复一个字段

b.重复多个字段

c.重复一整行

创建测试表:

复制代码 代码如下:

create table cfa (businessid number,customer varchar2(50),branchcode varchar2(10),data_date varchar2(10));
insert into cfa values (1,'Albert','SCB','2011-11-11');
insert into cfa values (2,'Andy','DB','2011-11-12');
insert into cfa values (3,'Allen','HSBC','2011-11-13');

---------------以下为重复数据----------------------------------------------
insert into cfa values (1,'Alex','ICBC','2011-11-14');
insert into cfa values (1,'Albert','CTBK','2011-11-15');
insert into cfa values (1,'Albert','SCB','2011-11-11');


对于a的情况,只有businessid重复

复制代码 代码如下:

select * from cfa where businessid in (select businessid from cfa group by businessid having count(businessid)>1);

如果是b的情况,businessid 和name同时存在重复

复制代码 代码如下:

select * from cfa where (businessid,customer) in (select businessid,customer from cfa group by businessid,customer having count(*)>1);

对于c的情况,重复一整行

参考b的方法:

复制代码 代码如下:

select * from cfa where (businessid,customer,branchcode,data_date) in (select * from cfa group by businessid,customer,branchcode,data_date having count(*)>1);

2、删除表中的重复数据
a情况,删除表中多余的重复记录,重复记录是根据单个字段(businessid)来判断,只留有rowid最小的记录

也可以只保留rowid不是最小记录,需要把代码中的min改为max这里不再赘述。

复制代码 代码如下:

delete from cfa
where businessid in (select businessid
from cfa
group by businessid
having count(businessid) > 1)
and rowid not in (select min(rowid)
from cfa
group by businessid
having count(businessid) > 1);


或者,使用下面更简单高效的语句

复制代码 代码如下:

DELETE FROM cfa t
WHERE t.ROWID >
(SELECT MIN(X.ROWID) FROM cfa X WHERE X.businessid = t.businessid);

b情况,删除表中多余的重复记录(多个字段),只留有rowid最小的记录

复制代码 代码如下:

delete from cfa
where (businessid,customer) in (select businessid,customer
from cfa
group by businessid,customer
having count(*) > 1)
and rowid not in (select min(rowid)
from cfa
group by businessid,customer
having count(*) > 1);

或者,使用下面更简单高效的语句

复制代码 代码如下:

DELETE FROM cfa t
WHERE t.ROWID > (SELECT MIN(X.ROWID)
FROM cfa X
WHERE X.businessid = t.businessid
and x.customer = t.customer);

c情况,这种情况就比较简单,使用临时表方法

复制代码 代码如下:

create table cfabak as select distinct * from cfa;

truncate table cfa;--如果是生产最好对该表backup

Insert into cfa select * from cfabak;

commit;

查看更多关于【Oracle教程】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
SQL中查找某几个字段完全一样的数据
本文分享SQL语句实现表中字段的组合累加排序的实例代码,希望能给大家做一个参考。

0评论2016-06-20589

SQL 双亲节点查找所有子节点的实现方法
下面小编就为大家带来一篇SQL 双亲节点查找所有子节点的实现方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

0评论2016-06-20209

MySQL优化之如何查找SQL效率低的原因
这篇文章主要介绍了MySQL优化之如何查找SQL效率低的原因 ,需要的朋友可以参考下

0评论2015-11-23107

MySQL 中查找含有目标字段的表的方法
这篇文章主要介绍了MySQL 中查找含有目标字段的表的方法,即查找某个字段在哪个表中,这在一些场景中非常有用,需要的朋友可以参考下

0评论2015-11-1599

在MySQL中同时查找两张表中的数据的示例
这篇文章主要介绍了在MySQL中同时查找两张表中的数据的示例,即一次查询操作返回两张表的结果,需要的朋友可以参考下

0评论2015-11-13120

mysql实现根据多个字段查找和置顶功能
在mysql中,如果要实现根据某个字段排序的时候,可以使用下面的SQL语句,下面为大家介绍下如何实现根据多个字段查找和置顶功能

0评论2015-11-0668

mysql unix准换时间格式查找指定日期数据代码
这篇文章主要介绍了mysql unix准换时间格式查找指定日期数据,需要的朋友可以参考下

0评论2015-11-02115

SQL Server根据分区表名查找所在的文件及文件组实现脚本
这篇文章主要介绍了SQL Server根据分区表名查找所在的文件及文件组实现脚本,本文直接给出实现代码,需要的朋友可以参考下

0评论2015-08-1851

Redis中实现查找某个值的范围
这篇文章主要介绍了Redis中实现查找某个值的范围,本文的题引来了Redis作者Salvatore Sanfilippo(@antirez)的回答,比较经典,需要的朋友可以参考下

0评论2015-08-12132

查找sqlserver查询死锁源头的方法sqlserver死锁监控
如何查出SQL Server死锁的原因,下面就教您SQL Server死锁监控的语句写法,下面的SQL语句运行之后,便可以查找出SQLServer死锁和阻塞的源头

0评论2015-07-29125

查找oracle数据库表中是否存在系统关键字的方法
遇到列说明无效的报错情况,这是由于数据库列名起的不好引起的,名字用到了数据库的关键字

0评论2015-07-1089

在MySQL中实现二分查找的详细教程
这篇文章主要介绍了在MySQL中实现二分查找的详细教程,来自计算机研究生考试原题,需要的朋友可以参考下

0评论2015-06-28247

查找MySQL线程中死锁的ID的方法
这篇文章主要介绍了查找MySQL线程中死锁的ID的方法,文中介绍的方法主要是从数据字典里查找,需要的朋友可以参考下

0评论2015-06-28118

用SQL语句查找Access中某表是否存在的小技巧
在Access数据库中通过SQL语句找到某一表是否存在的确是一件困难的事,按照下面的步骤执行并在程序中通过SQL语句查询表是否存在

0评论2015-06-28143

更多推荐