点击上方蓝字关注我

数据库中表存在重复数据,需要清理重复数据,清理后保留其中一条的情况是比较常见的需求,如何通过1条SQL准确的删除数据呢?

1. 创建表及测试数据

1.1 数据库中创建一张测试表

CREATE TABLE `test` (`id` INT  NOT NULL AUTO_INCREMENT,`c1` VARCHAR(20) DEFAULT NULL,`c2` VARCHAR(20) DEFAULT NULL,`c3` INT  DEFAULT NULL,`c4` DATETIME DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB  DEFAULT CHARSET=utf8;

1.2 插入测试数据

INSERT INTO test(c1,c2,c3,c4) VALUES( 'a','b',10, '2022-05-24 18:00:46'),('a','c',20, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'a','c',10, '2022-05-24 18:00:46'),('a','b',20, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'b','c',10, '2022-05-24 18:00:46'),('d','b',20, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'b','c',20, '2022-05-24 18:00:46'),('d','b',30, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'b','c',20, '2022-05-24 18:00:46'),('a','b',40, '2022-05-24 18:00:46');
INSERT INTO test(c1,c2,c3,c4) VALUES( 'd','b',40, '2022-05-24 18:00:46'),('r','f',40, '2022-05-24 18:00:46');

1.3 查看重复数据

例如c1,c2 这2个字段组合作为唯一条件,则查询重复数据的SQL如下

SELECTc1,c2,COUNT(*)
FROMtest
GROUP BY c1,c2
HAVING COUNT(*) > 1;

可见,结果如下:

2. 如何删除重复数据

2.1  方案一

很多研发同学习惯的思路如下:

  • 先查出重复的记录(使用in)

  • 再查出在重复记录但id不在每组id最大值的记录

  • 直接将select 改为delete进行删除

查询SQL如下

SELECT *    FROM  test
WHERE (c1,c2) IN (
SELECT c1,c2
FROM test
GROUP BY c1,c2
HAVING COUNT(*)>1 )
AND  id NOT  IN (
SELECT MAX(id)
FROM  test
GROUP BY c1,c2
HAVING COUNT(*)>1)ORDER BY c1,c2
;

看上去比较符合结果了,但是改为delete执行的时候结果如下:

--  delete SQL
DELETE FROM  test
WHERE (c1,c2) IN (
SELECT c1,c2
FROM test
GROUP BY c1,c2
HAVING COUNT(*)>1 )
AND  id NOT  IN (
SELECT MAX(id)
FROM  test
GROUP BY c1,c2
HAVING COUNT(*)>1)

出现报错信息:

错误代码:1093
You can't specify target table 'test' for update in FROM clause

也就是说MySQL里需删除的目标表在in子查询中时,不能直接执行删除操作

3. 推荐写法

基于以上情况,使用单条SQL删除的方式如下:

查询SQL:

SELECT  a.*
FROM  test  a ,
(SELECT  c1,c2,MAX(id)id FROM test  GROUP BY c1,c2 HAVING COUNT(*)>1)b
WHERE    a.c1=b.c1 AND a.c2=b.c2
AND a.id <>b.id

删除SQL

DELETE  a
FROM  test  a ,
(SELECT  c1,c2,MAX(id)id FROM test  GROUP BY c1,c2 HAVING COUNT(*)>1)b
WHERE    a.c1=b.c1 AND a.c2=b.c2
AND a.id <>b.id

结果:

<n>查询:delete a FROM test a , (select c1,c2,max(id)id from test group by c1,c2 having count(*)>1)b where a.c1=b.c1 and a.c2=b.c2 and a....共 7 行受到影响

删除后数据如下:

无重复数据了。

往期精彩回顾

1.  MySQL高可用之MHA集群部署

2.  mysql8.0新增用户及加密规则修改的那些事

3.  比hive快10倍的大数据查询利器-- presto

4.  监控利器出鞘:Prometheus+Grafana监控MySQL、Redis数据库

5.  PostgreSQL主从复制--物理复制

6.  MySQL传统点位复制在线转为GTID模式复制

7.  MySQL敏感数据加密及解密

8.  MySQL数据备份及还原(一)

9.  MySQL数据备份及还原(二)

扫码关注

如何正确的使用一条SQL删除重复数据相关推荐

  1. SQL删除重复数据方法

    原文:SQL删除重复数据方法 例如: id           name         value 1               a                 pp 2            ...

  2. sql 删除重复数据

    sql 删除重复数据 问题是这样的.今天在一个技术群里,一个群友提了一个问题: 大概是,一张学生表 student,有字段 id (自增), name, 想要删除多余的重复name 的数据,剩下id最 ...

  3. sql 删除重复数据 只保留一条

    oracle 删除重复数据 只保留一条 DELETE from t_ows_compelete_rfc WHERE operation_no is null IN ( SELECT operation ...

  4. oracle如何删除重复数据第一条,oracle删除重复数据保留第一条记录

    oracle删除重复数据保留第一条记录 1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 gr ...

  5. 表之sql删除重复数据、查找去除重复数据、DISTINCT用法

    目录 一.查找去除重复数据 二.删除重复数据 三.DISTINCT用法 一.查找去除重复数据 数据如图: id可以理解为uuid,person_sort_code可以理解为唯一的标识,但是唯一标识重复 ...

  6. Oracle PL/SQL 删除重复数据

    参考:http://blog.itpub.net/22708224/viewspace-621116/ 问题描述: 我的需求是删除数据空中完全重复的数据 解决方案: 搜索非重复的数据(如果两行数据完全 ...

  7. MySQL中删除重复数据

    2019独角兽企业重金招聘Python工程师标准>>> 参考网页 SQL删除重复数据只保留一条 https://blog.csdn.net/anya/article/details/ ...

  8. SQL 查询重复数据并显示重复次数

    查询有重复数据的记录 select * from F group by a,b,c,d having count(*)>1 删除重复一模一样的记录,只保留一条记录 select distinct ...

  9. SQL表之间复制数据、选出随机几条数据、删除重复数据、取得自增长列等操作...

    --表之间数据复制 SELECT* INTO yozhu FROM yo --复制一份表 SELECT* INTO yozhu1 FROM yo where 1<>1 --只复制表结构,无 ...

最新文章

  1. 推荐8个可以显著提高工作效率的办公神器
  2. AJAX实用教程——获取博客园博文列表
  3. oracle简版如何打开,如何打开和关闭Oracle游标
  4. 博客远非“第五力量”
  5. linux efi分区安装grub2,GitHub - beatfan/UEFI_grub2: uefi 版本 grub2,可以引导多系统,以及linux的安装...
  6. 电路图:LM3886 BTL功放电路图
  7. idea Translation插件翻译失败。TKK: 更新 TKK 失败,请检查网络连接
  8. MATLAB神经网络工具箱(简单操作介绍)
  9. 微信小程序canvas画布新接口type为2D时drawImage方法的使用以及注意事项
  10. 关于使用SXSSFWorkbook对象下载excel文件,打开文件后excel文件损坏
  11. 关于CSS九宫格展示图片写法
  12. 小区智能化平台服务器,小区智能化报价
  13. phpmyadmin爆破脚本练习
  14. 第九回(一):任侠厨子轻解厄围 夜半蹴鞠为泄忿闷
  15. 让HR主动邀请你面试的简历,该如何写?
  16. node菜鸟入门笔记
  17. 51单片机的新手入门前所有疑问整理
  18. 自动更新Android应用后, app 进入后台重进会重启
  19. Jmeter自定义Java请求
  20. ffmpeg命令分析-ac

热门文章

  1. 《电子测量与仪器学报》2023.5.25最新投稿经验
  2. 宝藏又小众的立春海报设计素材网站分享
  3. 如何将pdf大小压缩?怎么缩小pdf的文件大小?
  4. 穿越派+PotPlayer=私有云盘(在线分享播放电影和音乐)
  5. DELL各计算机系列原厂壁纸下载方法
  6. U3D低边模型 POLYGON - Apocalypse Pack
  7. 代码重构新手教程:如何将烂代码变成好代码?
  8. 集合元素处理(传统方式),Stream流方式处理
  9. icmp回复报文_ICMP报文
  10. delphi FMX.WebBrowser与H5交互JavaScript