一条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 ...
随机推荐
- JS实现PC端URL跳转到对应移动端URL
在做移动端网站时,有时因技术问题或其他原因无法制作响应式版面,而移动端页面只能放到子目录下,但是手机端通过搜索引擎进入网站电脑端子页面,无法匹配到移动端页面,使得用户体验很不好,即影响排名也影响转化. ...
- chrome和Firefox浏览器渲染页面的不同
一直很好奇chrome和firefox这两大浏览器的页面渲染有什么不同,今天自己写了些html代码来做了下检验. 先做html编码,代码如下: <!DOCTYPE html><htm ...
- ajax实现注册并选择头像后上传
在初次接触ajax后,我们做了一个crm训练的项目,大多数小组都有注册用户这一项,但是都忽略掉了一个功能,那就是,很多网站的注册是可以上传头像的,在这里我做了一个在已有的头像数组里选择图片上传作头像的 ...
- JUC : 并发编程工具类的使用
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.JUC是什么 1.JUC定义 JUC,即java.util.concurrent 在并发编程中使用的 ...
- Java实现 蓝桥杯VIP 基础练习 回形取数
问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m ...
- Java实现 LeetCode 146 LRU缓存机制
146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...
- SQL server怎么查找某个时间段(多个时间段)的第一个值 或 最后一个值(这里举例查找每小时的第一个值)(Convert详细方法)
我们就举例查找每小时第一次测量的PM2.5的值吧 如下图,我们可以看出,时间非常乱,毫无规律 select min(时间) from a2 group by CONVERT(nvarchar(13), ...
- Java实现Catenyms(并查集+dfs+欧拉回路)
Description A catenym is a pair of words separated by a period such that the last letter of the firs ...
- (二)SQL注入常用的内置函数整理(以MySql为例)
[1]@@datadir 函数作用:返回数据库的存储目录构造SQL语句 select @@datadir; [2]@@version_compile_os 函数作用:查看服务器的操作系统SQL语句 ...
- opencl(3)程序、内核
1:程序 1)从上下文中创建程序 cl_program clCreateProgramWithSource( cl_context context, //上下文 cl_uint count, //文本 ...