如何正确的使用一条SQL删除重复数据
点击上方蓝字关注我
数据库中表存在重复数据,需要清理重复数据,清理后保留其中一条的情况是比较常见的需求,如何通过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删除重复数据相关推荐
- SQL删除重复数据方法
原文:SQL删除重复数据方法 例如: id name value 1 a pp 2 ...
- sql 删除重复数据
sql 删除重复数据 问题是这样的.今天在一个技术群里,一个群友提了一个问题: 大概是,一张学生表 student,有字段 id (自增), name, 想要删除多余的重复name 的数据,剩下id最 ...
- sql 删除重复数据 只保留一条
oracle 删除重复数据 只保留一条 DELETE from t_ows_compelete_rfc WHERE operation_no is null IN ( SELECT operation ...
- oracle如何删除重复数据第一条,oracle删除重复数据保留第一条记录
oracle删除重复数据保留第一条记录 1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 gr ...
- 表之sql删除重复数据、查找去除重复数据、DISTINCT用法
目录 一.查找去除重复数据 二.删除重复数据 三.DISTINCT用法 一.查找去除重复数据 数据如图: id可以理解为uuid,person_sort_code可以理解为唯一的标识,但是唯一标识重复 ...
- Oracle PL/SQL 删除重复数据
参考:http://blog.itpub.net/22708224/viewspace-621116/ 问题描述: 我的需求是删除数据空中完全重复的数据 解决方案: 搜索非重复的数据(如果两行数据完全 ...
- MySQL中删除重复数据
2019独角兽企业重金招聘Python工程师标准>>> 参考网页 SQL删除重复数据只保留一条 https://blog.csdn.net/anya/article/details/ ...
- SQL 查询重复数据并显示重复次数
查询有重复数据的记录 select * from F group by a,b,c,d having count(*)>1 删除重复一模一样的记录,只保留一条记录 select distinct ...
- SQL表之间复制数据、选出随机几条数据、删除重复数据、取得自增长列等操作...
--表之间数据复制 SELECT* INTO yozhu FROM yo --复制一份表 SELECT* INTO yozhu1 FROM yo where 1<>1 --只复制表结构,无 ...
最新文章
- 推荐8个可以显著提高工作效率的办公神器
- AJAX实用教程——获取博客园博文列表
- oracle简版如何打开,如何打开和关闭Oracle游标
- 博客远非“第五力量”
- linux efi分区安装grub2,GitHub - beatfan/UEFI_grub2: uefi 版本 grub2,可以引导多系统,以及linux的安装...
- 电路图:LM3886 BTL功放电路图
- idea Translation插件翻译失败。TKK: 更新 TKK 失败,请检查网络连接
- MATLAB神经网络工具箱(简单操作介绍)
- 微信小程序canvas画布新接口type为2D时drawImage方法的使用以及注意事项
- 关于使用SXSSFWorkbook对象下载excel文件,打开文件后excel文件损坏
- 关于CSS九宫格展示图片写法
- 小区智能化平台服务器,小区智能化报价
- phpmyadmin爆破脚本练习
- 第九回(一):任侠厨子轻解厄围 夜半蹴鞠为泄忿闷
- 让HR主动邀请你面试的简历,该如何写?
- node菜鸟入门笔记
- 51单片机的新手入门前所有疑问整理
- 自动更新Android应用后, app 进入后台重进会重启
- Jmeter自定义Java请求
- ffmpeg命令分析-ac