情景:

  我们的数据库中可能会存在很多因各种原因而重复的记录,我们需要对这些重复的记录进行删除,每组组重复的记录只保留一条就行

例如我们有这么个表:两个框框都是有重复记录的,红框和绿框都只需要留下一条,其他的都干掉。

前提:

  1:每天记录都要有一个唯一id

  2:每组重复的记录要有字段能进行分组,例如上面我们按name、class、age、score相同的就是一组。

数据宝贵,请先备份!!!

数据宝贵,请先备份!!!

数据宝贵,请先备份!!!

放上整条SQL:

DELETE FROM "t_hw_test_del" t3
WHERE 1 = 1 AND EXISTS (
SELECT * FROM (
SELECT
"id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1
)t1 LEFT JOIN (
SELECT
"MAX"("id") as "id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1
GROUP BY "name","class","age","score"
) t2 ON t1."id" = t2."id"
AND t1."name" = t2."name"
AND t1."class" = t2."class"
AND t1."age" = t2."age"
AND t1."score" = t2."score"
WHERE t2."id" is NULL AND t1."id" = t3."id"
)

按步分析:

1:找到我们需要的记录,因为我们可能只是要处理某天的记录,所以要先筛选一下,我这里用1=1来代替

SELECT
*
FROM
"t_hw_test_del"
WHERE 1 = 1

2:找到我们每一组要保留的记录 ,我这里选每组id最大的保留,其他的不要
SELECT
"MAX"("id") as "id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1
GROUP BY "name","class","age","score"

3:用我们找到的需要处理的记录和要保留的记录关联起来, 用分组字段和唯一id关联,左联

SELECT * FROM (
SELECT
"id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1
)t1 LEFT JOIN (
SELECT
"MAX"("id") as "id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1
GROUP BY "name","class","age","score"
) t2 ON t1."id" = t2."id"
AND t1."name" = t2."name"
AND t1."class" = t2."class"
AND t1."age" = t2."age"
AND t1."score" = t2."score"

4:右表为null的记录,对应的左表记录就是我们要删掉的,加个条件右表为null

SELECT * FROM (
SELECT
"id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1
)t1 LEFT JOIN (
SELECT
"MAX"("id") as "id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1
GROUP BY "name","class","age","score"
) t2 ON t1."id" = t2."id"
AND t1."name" = t2."name"
AND t1."class" = t2."class"
AND t1."age" = t2."age"
AND t1."score" = t2."score"
WHERE t2."id" is NULL

5: 用我们原来的记录id在我们不需要的记录里面找,如果这条记录在我们不需要的记录集里,那这条记录就可以删除

DELETE FROM "t_hw_test_del" t3
WHERE 1 = 1 AND EXISTS (
SELECT * FROM (
SELECT
"id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1
)t1 LEFT JOIN (
SELECT
"MAX"("id") as "id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1
GROUP BY "name","class","age","score"
) t2 ON t1."id" = t2."id"
AND t1."name" = t2."name"
AND t1."class" = t2."class"
AND t1."age" = t2."age"
AND t1."score" = t2."score"
WHERE t2."id" is NULL AND t1."id" = t3."id"
)

 6: 检查一下结果符不符合我们的要求

SELECT
"id","name","class","age","score"
FROM
"t_hw_test_del"
WHERE 1 = 1

一条SQL删除重复记录,重复的只保留一条的更多相关文章

  1. PHP mysql 删除表中所有数据只保留一条

    DELETE FROM `logs` WHERE wangzhi='www.juhutang.com' and id<>101072; 上面这段代码的意思为 删除表logs中 所有字段wa ...

  2. SQL循环遍历,删除表里某一列是重复的数据,只保留一条。

    DECLARE @tempId NVARCHAR(Max), @tempIDD uniqueidentifier WHILE EXISTS ( SELECT UserId FROM Users Gro ...

  3. 你真的会玩SQL吗?删除重复数据且只保留一条

    在网上看过一些解决方法 我在此给出的方法适用于无唯一ID的情形 表:TB_MACVideoAndPicture 字段只有2个:mac,content mac作为ID,正常情况下mac数据是唯一的,由于 ...

  4. 【转】SQL删除重复记录,只保留其中一条

    SQL:删除重复数据,只保留一条用SQL语句,删除掉重复项只保留一条在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peop ...

  5. SQL根据B表内容修改A表内容,查询表中重复记录,删除掉重复项只保留一条

    以下sql是a,b两张表通过关联条件id修改a表值,如果b表有重复数据记录,选第一条更新,红色条件为附加限制条件,具体视情况而定: UPDATE a SETname = b.fname,pwd = b ...

  6. SQL删除重复的记录(只保留一条)

    首先新建表: --创建示例表 CREATE TABLE t ( id ,) PRIMARY KEY, a ), b ) ) --插入数据 INSERT INTO t SELECT 'aa','bb' ...

  7. SQL删除重复数据只保留一条

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...

  8. Oralce中SQL删除重复数据只保留一条(转)

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 .查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...

  9. 用SQL语句,删除掉重复项只保留一条

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...

随机推荐

  1. Verilog - ABS代码重构

    https://mp.weixin.qq.com/s/-KUviTzO3Hdir_mI57L24g 从形式和语义两个层面,来扣一下ABS这段代码. 目的在于:在不降低通用性.不增加复杂度的情况下,提升 ...

  2. Java实现 LeetCode 417 太平洋大西洋水流问题

    417. 太平洋大西洋水流问题 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的 ...

  3. Java实现 LeetCode 179 最大数

    179. 最大数 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 ...

  4. java实现第五届蓝桥杯等额本金

    等额本金 题目描述 小明从银行贷款3万元.约定分24个月,以等额本金方式还款. 这种还款方式就是把贷款额度等分到24个月.每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息. 假设月利率是 ...

  5. 自己动手写SQL执行引擎

    自己动手写SQL执行引擎 前言 在阅读了大量关于数据库的资料后,笔者情不自禁产生了一个造数据库轮子的想法.来验证一下自己对于数据库底层原理的掌握是否牢靠.在笔者的github中给这个database起 ...

  6. oracle使用+简写左关联出现的结果集不一致问题

    这是使用(+)的sql语句(已简写) select a.id,b.num from a,b where a.id=b.id(+) and b.num>10 这是使用left join的sql语句 ...

  7. kibana的Dev Tool中如何对es进行增删改查

    kinaba Dev Tool中对es(elasticSearch)进行增删改查 一.查询操作 查询语句基本语法 以下语句类似于mysql的: select * from  xxx.yyy.topic ...

  8. RocketMQ系列(四)顺序消费

    折腾了好长时间才写这篇文章,顺序消费,看上去挺好理解的,就是消费的时候按照队列中的顺序一个一个消费:而并发消费,则是消费者同时从队列中取消息,同时消费,没有先后顺序.RocketMQ也有这两种方式的实 ...

  9. Apollo移植

    Apollo移植 环境 平台 ubuntu16.04 Apollo_kernel 1.0 安装步骤步骤 步骤一:安装ubuntu(官方建议使用Ubuntu 14.04.3) 步骤一和步骤二参考文档路径 ...

  10. Vue项目实战之改动饿了吗购物小球动画

    html:没有写v-on: afterEnter函数了,因为执行不到,原因是enter的done: <div class="ball-container"><tr ...