一条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 ...
随机推荐
- Azure AD(三)知识补充-Azure资源的托管标识
一,引言 来个惯例,吹水! 前一周因为考试,还有个人的私事,一下子差点颓废了.想了想,写博客这种的东西还是得坚持,再忙,也要检查.要养成一种习惯,同时这也是自我约束的一种形式.虽然说不能浪费大量时间在 ...
- Attribute (XXX) is obsolete. Its use is discouraged in HTML5 documents.
这种警告主要是因为这些属性在HTML5中过时了,并不影响代码运行,但是一些强迫症就会非常难受. 解决办法: 将程序的顶部的这句: !DOCTYPE 修改为: !DOCTYPE html PUBLIC ...
- java继承会犯的小错误
注意事项:阅读本文前应该先了解java的继承.本文定位为已经继承基础知识. 一:试图覆盖私有方法 先上代码 public class Father { private void print() { S ...
- Java实现 LeetCode 621 任务调度器(暴力大法)
621. 任务调度器 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时 ...
- Java实现 LeetCode 567 字符串的排列(滑动窗口,处理区间内的字符数量)
567. 字符串的排列 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: 输入: s1 = " ...
- Java实现 LeetCode 392 判断子序列
392. 判断子序列 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符 ...
- Java实现 洛谷 P1601 A+B Problem(高精)
import java.util.*; import java.math.*; public class Main { public static void main(String args[]) { ...
- 数据的存储结构浅析LSM-Tree和B-tree
目录 顺序存储与哈希索引 SSTable和LSM tree B-Tree 存储结构的比对 小结 本篇主要讨论的是不同存储结构(主要是LSM-tree和B-tree),它们应对的不同场景,所采用的底层存 ...
- (二)linux三剑客之awk
1.awk是什么和上一节的grep有什么区别? 2.awk解决了哪些问题? 3.awk的工作原理? 4.awk的基础用法? 5.awk技术常用[收藏] 1.awk是什么? awk 用于处理文本,gre ...
- 【图机器学习】cs224w Lecture 16 - 图神经网络的局限性
目录 Capturing Graph Structure Graph Isomorphism Network Vulnerability to Noise 转自本人:https://blog.csdn ...