Oracle数据库删除多余重复数据

在Oracle中常常遇到这样的问题,有一张表a,其中存在多条id不同但是信息相同的数据。需求是删除多余的重复数据。

1.准备表 test

create table test(
id number not null primary key, 
day date not null);  

2.准备数据

insert into test(id, day) values(4, to_date('2006-10-08','yyyy-mm-dd'));  
insert into test(id, day) values(5, to_date('2006-10-08','yyyy-mm-dd'));  
insert into test(id, day) values(6, to_date('2006-10-10','yyyy-mm-dd'));  

insert into test(id, day) values(7, to_date('2006-10-08','yyyy-mm-dd'));  
insert into test(id, day) values(8, to_date('2006-10-10','yyyy-mm-dd'));  
insert into test(id, day) values(9, to_date('2006-10-11','yyyy-mm-dd'));  

insert into test(id, day) values(10, to_date('2006-10-11','yyyy-mm-dd'));  
insert into test(id, day) values(11, to_date('2006-10-12','yyyy-mm-dd'));  
insert into test(id, day) values(12, to_date('2006-10-12','yyyy-mm-dd')); 

下面我们通过最常见的分组函数的方法进行处理这样的问题。

 核心是通过Oracle自带的Rowid进行删除操作。(Oracle确实强大,提供了伪列的概念。伪列是在insert操作时给当条数据进行唯一标识。)

废话不多说,上干货:

delete from test a
where a.day in
(select day from test group by day having count(*) > 1)
and rowid not in
(select min(rowid) from test group by day having count(*) > 1)
上述是本讲的结果SQL代码,该代码可实现多余重复数据的删除操作。
核心代码:

where a.day in
(select day from test group by day having count(*) > 1)   对当前表进行分组找出重复项。
and rowid not in
(select min(rowid) from test group by day having count(*) > 1) 
找出重复项,在进行重复同时利用伪列rowid显示最小(或最大)的伪列。 通过唯一标识的伪列进行删除操作。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值