sql:删除重复数据并且只保留id最小的一条

一、使用情况

当测试数据库中,有重复数据会导致selectOne报错时,确认是数据错误的问题后,可以使用这句sql,只保留id最小的一条数据,删除其余的重复数据。

二、场景实例

例如有下方这样的数据:

id | name | openid
1 | 张三 | 2_0_10001234
2 | 张三 | 2_0_10001234
3 | 张三 | 2_0_10001234

其中,有3条openid重复的数据;

现在要删掉重复的、只留下id最小的1条,如下:

id | name | openid
1 | 张三 | 2_0_10001234

三、sql样例

delete from employee where id in (

  select a.aid from (
  
  select id as aid from employee
  where openid in (
    select openid from employee group by openid having count(*)>1
  )

  ) a left join (

    select min(id) as bid from (
      select id,openid from employee
      where openid in (
      select openid from employee group by openid having count(*)>1
      )
    ) t group by openid

  ) b on a.aid=b.bid where b.bid is null

)

四、说明

1.首先按openid分组,查询出>1的id;
2.然后使用min(id)与group by openid,得到大于1的id集合中最小的id;
3.然后使用left join,得到按openid分组后、大于1的id集合中、除了每组最小id后的剩余的id;
4.最后使用delete与in,删除目标id行;
5.这样就实现了,删除表中openid重复的数据、同时保留重复数据中每组id最小的那行。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐梦想永不停

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值