如何正确的使用一条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如下SELECT c1, c2, COUNT(*) FROM test 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
删除SQLDELETE 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
结果:查询: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 行受到影响
删除后数据如下:
无重复数据了。
想要了解更多数据库技术文章,可关注微信公众"数据库干货铺"获取
我省灵活就业人员社保补贴先缴后补山西晚报讯(记者武佳)日前,省人社厅就进一步促进灵活就业人员参加社会保险有关问题下发通知,鼓励灵活就业人员参加社会保险,要求落实灵活就业人员社保补贴政策,社保补贴实行先缴后补。灵活
金价微涨!2022年10月26日各大金店黄金价格多少钱一克?周三(10月26日),国际金价走高。由于并未形成方向性行情,今天国内金店的黄金价格大部分维持不变,老凤祥金价上涨1元,周生生黄金下跌1元,这是今天官网公布的黄金报价(仅供参考)金店
北京瀛台律师事务所未批先征村民承包地!法院严重违法案件回放小魏的承包地在宁夏回族自治区xx县附近,四至范围东靠王x,金x,西靠马x金x刘x,南靠生产路,北靠公路。2019年下半年xx县相关部门携同xx村的村委会对案涉土地进行了丈量
贵州百灵前三季实现净利润1亿元中证网讯(记者康曦)10月26日晚间,贵州百灵发布2022年三季报,公司前三季度实现营业收入20。99亿元,同比增长6。09实现归属于上市公司股东的净利润1亿元,同比下降16。97
14岁就长到197?现在小孩子的身高也太厉害了吧,哈哈怎么跟视频上有点不一样呢不得不说今天的风看着有点大了啊遇到这样的司机现在下车还来得及吗像极了我出门的样子小伙子你这么吃真的不感觉到辣吗这么懂事的狗子现在已经不多了啊这就有点小气了你
开征消费税有利于对电子烟严管善用秋实10月25日,财政部海关总署税务总局发布关于对电子烟征收消费税的公告。自11月1日起,对电子烟执行征收消费税,实行从价定率的办法计算。生产(进口)环节的税率为36,批发环节的税
法证先锋5今晚开播!仅一位原班人马,3大看点太精彩法证先锋5今晚开播!10月26日1800,它将登陆优酷港剧档,再续经典,开启脑力破案模式。网友惊喜之余,却发现法证先锋5仅一位原班人马,几乎是全员大换血。法证先锋5由黄宗泽蔡思贝袁
揭东区关于新增风险区域的通告根据当前疫情防控需要,按照国务院应对新型冠状病毒肺炎疫情联防联控机制综合组新型冠状病毒肺炎疫情防控方案(第九版)相关规定,经专家组研判,自2022年10月26日起,揭东区新增以下高
4队全败!湖人并肩弱旅,詹皇尴尬个人数据出色,球队进攻垫底NBA常规赛拉开大幕之后,各支球队的表现不同,开拓者一波4连胜表现极其出色,马刺灰熊也有不俗的发挥。截止到目前,联盟中有4支球队开局全败,分别是西部的国王湖人和雷霆,他们均是3连败
苹果第四财季在中国营收大涨,库克iPhone14Pro系列供不应求苹果公司正式公布2022财年第四财季业绩,整体表现符合预期,营收额与利润率都出现大幅增长,库克也做出了积极的表态。苹果公司认为,iPhone14系列销量供不应求,消费者都非常喜欢苹
上美集团三战IPO,韩束们老了?作者艺馨豆乳拿铁排版Cathy监制Yoda出品不二研究10月5日,韩束母公司上海上美化妆品股份有限公司(下称上美集团)向港交所再次递表,继续冲刺港股国货美妆第一股。上美集团是一家多