Oracle删除重复数据

先创建一张测试表Test(id,name,age)。

添加 4条测试数据,其中Name 小明有3个,Name 小明 Age12 重复了一次。

一、GROUP BY查找重复数据

单字段查找:按Name查找

select * from Test t where t.Name in(select s.name from test s group by s.name having count(*)>1) 

     Name为小明的数据都被查找出来了。由于可能是同名但年龄不同的两个人,即Name 小明 Age 12和Name 小明 Age 14是两个人,所以需要根据Name和Age两个字段查重复。

多个字段查找:按Name 和Age查找

select * from Test t where (t.name,t.age) in(select s.name,s.age from test s group by s.name,s.age having count(*)>1) 

 

二、GROUP BY删除多余的重复数据

     单字段判断:

    由于ID是唯一的,而id 1,3,4全是NAME为小明重复了,现在要删除重复的数据,只保留一条Name为小明的数据,这里我需要保存ID最大的那条数据。

delete from Test t
 where t.Name in
       (select s.name from test s group by s.name having count(*) > 1)
   and t.id not in
       (select max(id) from test group by name having count(*) > 1)

也可以多次执行下列语句来得到结果:

delete from Test t
 where t.id in
       (select min(id) from test s group by s.name having count(*) > 1)

执行后,查看表

Name为小明的数据只留下了ID最大的。

多字段判断:

还是保留ID最大的

delete from Test t
 where (t.name, t.age) in (select s.name, s.age
                             from test s
                            group by s.name, s.age
                           having count(*) > 1)
   and t.id not in (select max(id)
                      from test s
                     group by s.name, s.age
                    having count(*) > 1)

ID1与4重复,ID为1的被删除了

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值