一条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 ...
随机推荐
- hexo命令提示 hexo <command>
所有的hexo命令执行后都会提示 hexo <command> 解决方法: 通过hexo init blog命令初始化一个博客后,应该cd /blog 转到博客目录
- .net core 上传大文件
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Thr ...
- 【已解决】Ubuntu U盘启动出现“Failed to load ldlinux.c32”问题
利用UltraISO制作了Ubuntu的U盘启动,在USB启动时出现了 Failed to load ldlinux.c32 Boot failed: please change disks and ...
- JavaWeb项目:旅游网站【涉及各种知识】
JQuery异步请求(ajax) $.ajax({ // 请求方式为get或者post等 type: "GET", // 服务器响应的数据类型 dataType: "js ...
- treegrid树形表格的完美运用
一 问题描述: 树形表格TreeGrid在日常项目中还是运用的比较多的,哪我们在项目中,应该怎么引入和使用 TreeGrid呢? 二 使用步骤 1.首先我们需要在项目中,引入TreeGrid组件 需 ...
- Java实现 LeetCode 725 分隔链表(暴力)
725. 分隔链表 给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分. 每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 nu ...
- Java实现 LeetCode 514 自由之路
514. 自由之路 视频游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring"的金属表盘,并使用表盘拼写 ...
- Java实现 洛谷 P1423 小玉在游泳
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = ...
- Java实现最长回文串
1 问题描述 给定一个字符串,求它的最长回文子串的长度. 2 解决方案 2.1 中心扩展法 此处,首先枚举出回文串的中心位置,然后,再在该位置上分别向左和向右扩展,记录并更新得到的最长回文串的长度. ...
- java实现数字的值返回
以下的静态方法实现了:把串 s 中第一个出现的数字的值返回. 如果找不到数字,返回-1 例如: s = "abc24us43" 则返回 2 s = "82445adb5& ...