业务:一个表中有很多数据(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优化的更多相关文章

  1. oracle删除一个表内的重复数据,

    查询以及删除一个数据库表内的重复数据. 1.查询表中的多余的重复记录,重复记录是根据单个字段来判断的. select * from biao where id in (select id from b ...

  2. SqlSever基础 delete 删除一个表中的所有数据

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  3. Oracle、SQLServer 删除表中的重复数据,只保留一条记录

    原文地址: https://blog.csdn.net/yangwenxue_admin/article/details/51742426 https://www.cnblogs.com/spring ...

  4. Oracle删除表中的重复数据

    Oracle数据库删除表中的重复数据,只保留其中的一条,以两个字段为例,提供两种方法 ①.直接delete重复的数据 delete from table_name t1 where (t1.col1, ...

  5. oracle学习----去除表中的重复数据

    重复的数据可能有这样两种情况,第一种:表中只有某些字段一样,第二种:两行记录完全一样.第一.对于部分字段重复数据的删除        先来谈谈如何查询重复的数据吧.        下面语句可以查询出那 ...

  6. Excel中如何在两个工作表中查找重复数据

    有时我们可能会在两种工作表中查找重复记录,当数据记录很多时,就必须通过简单的方法来实现.下面小编就与大家一起分享一下查看重复记录数据的方法,希望对大家有所帮助. 方法/步骤   为了讲解的需要,小编特 ...

  7. 对一个表中所有列数据模糊查询adoquery

    如何用adoquery对一个表中所有列进行模糊查询: procedure TForm3.Button4Click(Sender: TObject); var ASql,AKey: string; I: ...

  8. mysql删除重复数据,保留最新的那一条

    因为数据库没键外键,在关联查询的时候,会碰到查询条数多余数据库实际条数,这因为关联字段在表中有重复值而导致的. 解决方案: 1.数据库脚本删除重复数据,保留最新的一条 2.对关联字段增加唯一约束 例如 ...

  9. SQLServer 删除表中的重复数据

    create table Student(        ID varchar(10) not null,        Name varchar(10) not null, ); insert in ...

随机推荐

  1. java算法之冒泡排序法

    由此可见:N个数字要排序完成,总共进行N-1趟排序,每第 i 趟的排序次数为 (N-i) 次,所以 可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即   for(inti=0;i& ...

  2. UVA 536 (13.08.17)

     Tree Recovery  Little Valentine liked playing with binary trees very much. Her favoritegame was con ...

  3. [Javascript] How to write a Javascript libarary

    Create package.json file //npm settings npm set init-author-name 'username' npm set init-author-emai ...

  4. LR使用Java User协议环境报错Please add the <JDK>\bin to the path and try again

    看标题报错信息就知道,这是java编译及运行环境配置问题,运行LR脚本时,LR代理找不到java的JDK环境,当然,可能有人会遇到说,我在cmd窗口javac 环境是没问题的呀,是的,这就要看你的jd ...

  5. MYSQL免安装版使用说明

    1>把压缩文件mysql-noinstall-5.1.6-alpha-win32.zip解压到一个目录下,在环境变量中设置MYSQL_HOME,把%MYSQL_HOME%\bin 加入到 pat ...

  6. html5前端开发笔记-个人中心

    简单的css自适应 PC端 *** 移动端 *** ) *** 一开始的想法就是模仿手机APP 的页面进行布局,首先得有个头部,然后是主题部分,然后加上2个按钮,分别是编辑和退出登录.先布出基本结构. ...

  7. 文本框脚本 - select 事件

    HTML中,用两种方式来表示文本框: input 单行文本.textarea 多行文本 那么在文本中存在哪些事件尼? 1    select 都支持 但是其触发的时机不一样 IE9+ .Safair ...

  8. JS操作URL

    function getQueStr(url, ref) //取获参数值 { ); ) { var arr = str.split('&'); for (i in arr) { ] == re ...

  9. ASP.NET的Application简介1

    ASP.NET中的Application 1. Application是用于保存所有用户共有的信息.在ASP时代,如果要保存的数据在应用程序生存期内不会或者很少改变,那么使用Application是理 ...

  10. 百度地图API提示"230错误 APP Scode校验失败"

    笔者近2天在 Android Studio上玩了一下百度地图,碰到了常见的"230错误 APP Scode校验失败",下面我来介绍一下具体的解决办法. 1.在andriodstud ...