删除一个表中的重复数据同时保留第一次插入那一条以及sql优化
业务:一个表中有很多数据(id为自增主键),在这些数据中有个别数据出现了重复的数据。
目标:需要把这些重复数据删除同时保留第一次插入的那一条数据,还要保持其它的数据不受影响。
解题过程:
第一步:查出所有要保留的下来的数据的id(save_id)
SELECT id as save_id
FROM yujing.alarm_event_info_snapshot aeis
where aeis.event_id in
(SELECT ae.id
FROM yujing.alarm_event ae
where ae.event_uuid like 'yuanwtj_%')
group by (aeis.event_id)
优化后:
SELECT aeis.id as save_id
FROM yujing.alarm_event ae
right join yujing.alarm_event_info_snapshot aeis
on aeis.event_id = ae.id
where ae.event_uuid like 'yuanwtj_%'
group by (aeis.event_id)
第二步:获取所有相关数据的id(all_id)
SELECT aeis.id as all_id
FROM yujing.alarm_event_info_snapshot aeis
where aeis.event_id in
(SELECT ae.id
FROM yujing.alarm_event ae
where ae.event_uuid like 'yuanwtj_%')
order by aeis.event_id
优化后:
SELECT aeis.id as all_id
FROM yujing.alarm_event ae
right join yujing.alarm_event_info_snapshot aeis
on aeis.event_id = ae.id
where ae.event_uuid like 'yuanwtj_%'
第三步:获取要删除的数据的
id(del_id)
select ad.all_id as del_id
from (SELECT aeis.id as all_id
FROM yujing.alarm_event_info_snapshot aeis
where aeis.event_id in
(SELECT ae.id
FROM yujing.alarm_event ae
where ae.event_uuid like 'yuanwtj_%')) as ad
where ad.all_id not in (SELECT id as save_id
FROM yujing.alarm_event_info_snapshot aeis
where aeis.event_id in
(SELECT ae.id
FROM yujing.alarm_event ae
where ae.event_uuid like 'yuanwtj_%')
group by (aeis.event_id))
优化后:
select ad.all_id as del_id
from (SELECT aeis.id as all_id
FROM yujing.alarm_event ae
right join yujing.alarm_event_info_snapshot aeis
on aeis.event_id = ae.id
where ae.event_uuid like 'yuanwtj_%') as ad
left join (SELECT aeis.id as save_id
FROM yujing.alarm_event ae
right join yujing.alarm_event_info_snapshot aeis
on aeis.event_id = ae.id
where ae.event_uuid like 'yuanwtj_%'
group by (aeis.event_id)) as sd
on ad.all_id = sd.save_id
where sd.save_id is null
第四步:根据id删除所有节点,注意mysql中如果有大量数据时需要批量删除,我最后使用了ETL工具进行的批量删除
总结:在mysql数据库中,sql语句中最好不要在in或not in关键字的查询里动态获取匹配的值,数据量大的情况下使用它们效率很低,可以使用左右连接来代替in操作,这样效率会提高很多倍,大数据量下尤为明显。
删除一个表中的重复数据同时保留第一次插入那一条以及sql优化的更多相关文章
- oracle删除一个表内的重复数据,
查询以及删除一个数据库表内的重复数据. 1.查询表中的多余的重复记录,重复记录是根据单个字段来判断的. select * from biao where id in (select id from b ...
- SqlSever基础 delete 删除一个表中的所有数据
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- Oracle、SQLServer 删除表中的重复数据,只保留一条记录
原文地址: https://blog.csdn.net/yangwenxue_admin/article/details/51742426 https://www.cnblogs.com/spring ...
- Oracle删除表中的重复数据
Oracle数据库删除表中的重复数据,只保留其中的一条,以两个字段为例,提供两种方法 ①.直接delete重复的数据 delete from table_name t1 where (t1.col1, ...
- oracle学习----去除表中的重复数据
重复的数据可能有这样两种情况,第一种:表中只有某些字段一样,第二种:两行记录完全一样.第一.对于部分字段重复数据的删除 先来谈谈如何查询重复的数据吧. 下面语句可以查询出那 ...
- Excel中如何在两个工作表中查找重复数据
有时我们可能会在两种工作表中查找重复记录,当数据记录很多时,就必须通过简单的方法来实现.下面小编就与大家一起分享一下查看重复记录数据的方法,希望对大家有所帮助. 方法/步骤 为了讲解的需要,小编特 ...
- 对一个表中所有列数据模糊查询adoquery
如何用adoquery对一个表中所有列进行模糊查询: procedure TForm3.Button4Click(Sender: TObject); var ASql,AKey: string; I: ...
- mysql删除重复数据,保留最新的那一条
因为数据库没键外键,在关联查询的时候,会碰到查询条数多余数据库实际条数,这因为关联字段在表中有重复值而导致的. 解决方案: 1.数据库脚本删除重复数据,保留最新的一条 2.对关联字段增加唯一约束 例如 ...
- SQLServer 删除表中的重复数据
create table Student( ID varchar(10) not null, Name varchar(10) not null, ); insert in ...
随机推荐
- java项目获取路径的几种方式
第一种: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); ...
- 格而知之16:我所理解的Block(3)
23.在前文中的例子中,Block结构体里的isa指针还没有详细讲解,这个指针都被置向了_NSConcreteStackBlock,它标识了Block的类型. 其实除了_NSConcreteStack ...
- [HDU 1317]XYZZY[SPFA变形][最长路]
题意: 一个图, 点权代表走到该点可获得的能量值. 可正可负. 一个人从1 号出发,带有100点能量. 问是否有一种方案可使人在能量值>0的时候走到n. 思路: 这个题首先要注意点权. 其实就是 ...
- ios 自己定义导航栏和切割线
自己定义导航栏: // CustomNaviBarView.h #import <UIKit/UIKit.h> @interface CustomNaviBarView : UIView ...
- emacs window版环境配置(设置默认的.emacs文件,指向自定义.emacs达到自定义home的目的)
1.下载解压包 下载地址 ,下载之后我是直接解压到E:\emacs中的,E:\emacs中就有bin,libexec…等文件; 2.点击bin中的addpm.exe文件进行安装emacs; 3.就会 ...
- [HeadFirst-HTMLCSS学习笔记][第六章严格的HTML]
远古 古老的html 4.01和XHTML 1.1 页面 必须用Doctype挑明,再html元素上面 html 4.01 <!DOCTYPE html PUBLIC "-//W3C/ ...
- JQuery hover(over,out) 使用笔记
转载自:http://www.douban.com/note/202404884/ JQuery hover(over,out) 使用笔记 JavaScript 下.onmouseover() 和 o ...
- C++菱形继承的构造函数
网上搜了很多,大多是关于菱形虚继承的构造函数应该怎么写,或者就是最简单的,四个类都不带参数的构造函数. 本文旨在记录一下困扰了博主1h的问题,非常浅显,有帮助固然好,如果侮辱谁的智商还见谅,当然无限欢 ...
- 使用VS调试64位应用程序
VS2012开始,就自带IIS Express,相比先前VS的Web调试器的弱智,和IIS的繁琐,Express简直是最佳方式啦. 本机环境是64位Win7 + 64位Oracle Client,调试 ...
- PHP学习笔记三十二【Exception】
<?php // $fp=fopen("a.txt","r"); // echo "ok"; if(!file_exists(&quo ...