一条SQL删除重复记录,重复的只保留一条
情景:
我们的数据库中可能会存在很多因各种原因而重复的记录,我们需要对这些重复的记录进行删除,每组组重复的记录只保留一条就行
例如我们有这么个表:两个框框都是有重复记录的,红框和绿框都只需要留下一条,其他的都干掉。

前提:
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

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删除重复记录,重复的只保留一条的更多相关文章
- PHP mysql 删除表中所有数据只保留一条
DELETE FROM `logs` WHERE wangzhi='www.juhutang.com' and id<>101072; 上面这段代码的意思为 删除表logs中 所有字段wa ...
- SQL循环遍历,删除表里某一列是重复的数据,只保留一条。
DECLARE @tempId NVARCHAR(Max), @tempIDD uniqueidentifier WHILE EXISTS ( SELECT UserId FROM Users Gro ...
- 你真的会玩SQL吗?删除重复数据且只保留一条
在网上看过一些解决方法 我在此给出的方法适用于无唯一ID的情形 表:TB_MACVideoAndPicture 字段只有2个:mac,content mac作为ID,正常情况下mac数据是唯一的,由于 ...
- 【转】SQL删除重复记录,只保留其中一条
SQL:删除重复数据,只保留一条用SQL语句,删除掉重复项只保留一条在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peop ...
- SQL根据B表内容修改A表内容,查询表中重复记录,删除掉重复项只保留一条
以下sql是a,b两张表通过关联条件id修改a表值,如果b表有重复数据记录,选第一条更新,红色条件为附加限制条件,具体视情况而定: UPDATE a SETname = b.fname,pwd = b ...
- SQL删除重复的记录(只保留一条)
首先新建表: --创建示例表 CREATE TABLE t ( id ,) PRIMARY KEY, a ), b ) ) --插入数据 INSERT INTO t SELECT 'aa','bb' ...
- SQL删除重复数据只保留一条
用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...
- Oralce中SQL删除重复数据只保留一条(转)
用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 .查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...
- 用SQL语句,删除掉重复项只保留一条
用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...
随机推荐
- python3程序开发指南——第1章 笔记
python文件的扩展名为.py ,但是python GUI程序的扩展名为.pyw 在python中,注释以#开始,作用范围为该行 IDLE提供了三个关键功能:输入python表达式与代码,并在pyt ...
- 2019-ICCV-PDARTS-Progressive Differentiable Architecture Search Bridging the Depth Gap Between Search and Evaluation-论文阅读
P-DARTS 2019-ICCV-Progressive Differentiable Architecture Search Bridging the Depth Gap Between Sear ...
- Rocket - config - DefaultConfig
https://mp.weixin.qq.com/s/zWW00D0fb8h7_TotGD9YoQ 介绍DefaultConfig类的组成. 1. DefaultConfig Defa ...
- 看板 | 漫话之减少WIP(在制品)
传统的流水线生产模式中,生产流程按生产程序进行划分,而各部分因动作的难度或复杂程度的差异导致用时不同. 例如:一个产品进行组装用时2分钟,完成装箱工作只需10秒.在这种情况下,组装动作用时长.产出慢, ...
- JAVASE(八) 数组: 一维数组、二维数组、动态数组、静态数组
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.一维数组 1.1 数组的声明和初始化声明方式: String str[]; //不建议使用 Stri ...
- Java实现 LeetCode 628 三个数的最大乘积(暴力大法)
628. 三个数的最大乘积 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例 1: 输入: [1,2,3] 输出: 6 示例 2: 输入: [1,2,3,4] 输出: 24 ...
- Java实现 蓝桥杯VIP 算法提高 插入排序
算法提高 插入排序 时间限制:1.0s 内存限制:256.0MB 插入排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...
- Java实现 蓝桥杯VIP 算法提高 阮小二买彩票
算法提高 阮小二买彩票 时间限制:1.0s 内存限制:512.0MB 问题描述 在同学们的帮助下,阮小二是变的越来越懒了,连算账都不愿意自己亲自动手了,每天的工作就是坐在电脑前看自己的银行账户的钱是否 ...
- java实现平面点最小距离
已知平面上若干个点的坐标. 需要求出在所有的组合中,4个点间平均距离的最小值(四舍五入,保留2位小数). 比如有4个点:a,b,c,d, 则平均距离是指:ab, ac, ad, bc, bd, cd ...
- 疫情期间我是如何拿到20k的offer,2020年php面试题汇总
推荐视频:面试10家公司,收获9个offer,2020年PHP 面试问题 第一阶段1-2年 我认为1-2年对于PHP程序员来说是第一个门槛,这一阶段菜鸟正式从理论迈向企业级开发.我们知道如何使用工具. ...