删除重复记录但保留其中一行数据的sql写法

news2024/9/25 21:23:57

欢迎关注微信公众号:互联网全栈架构

数据库表中存在重复记录的场景并不罕见,导致这种情况的原因可能是进行了数据迁移,或者程序代码有bug(比如并发情况没有处理好),或者在测试库中手动插入了重复数据,不管怎么样,它们可能都违反了业务规则约束,需要删除重复的数据记录,同时又需要保存其中的一条。除了在现实的工作中会碰到这种情况,面试中也经常会问起这个问题。那么,这个sql应该怎么写呢(基于MySQL数据库)?我们尝试用两种方法来实现这个功能。

当然,我们可以通过创建新表然后向新表中插入不重复的数据来完成,或者通过程序来实现这样的功能,但这样稍显麻烦,本文主要考虑的是用一条sql来完成。另外,重复数据主要是基于业务逻辑来判定的,比如除了主键以外,其它所有字段(或者其中某些字段)都相同则视为重复。

一、准备工作

创建一张客户表,向其中插入一些包含重复记录的测试数据:

CREATE TABLE `t_customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `cust_name` varchar(32) NOT NULL COMMENT '名字',
  `gender` varchar(10) NOT NULL COMMENT '性别',
  `email` varchar(32) NOT NULL COMMENT 'email',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `t_customer` VALUES ('1', 'Tom', 'Male', 'high_salary@sample.com');
INSERT INTO `t_customer` VALUES ('2', 'Jennifer', 'Female', 'good_job@sample.com');
INSERT INTO `t_customer` VALUES ('3', 'Tom', 'Male', 'high_salary@sample.com');
INSERT INTO `t_customer` VALUES ('4', 'John', 'Male', 'good_job@sample.com');
INSERT INTO `t_customer` VALUES ('5', 'Jennifer', 'Female', 'good_job@sample.com');
INSERT INTO `t_customer` VALUES ('6', 'Tom', 'Male', 'high_salary@sample.com');

我们约定,当客户的名字、性别、邮件都相同时,则判定它们为重复的记录。

28802b60249cf11c869c084d9abcd5d8.png

对于以上的测试数据,id等于1、3、6的为重复数据,id为2、5的也是重复数据,我们需要删除多余的数据,同时需要保留其中的一条。

、使用DELETE JOIN

表进行自关联,关联条件就是名称、性别和email,删除掉id较小的那些记录,保留id最大值,如果需要保留最小值,改成大于号即可:

DELETE c1 FROM t_customer c1 INNER JOIN t_customer c2
WHERE c1.id<c2.id AND c1.cust_name=c2.cust_name 
AND c1.gender=c2.gender AND c1.email=c2.email

上述sql执行完成后,表中的数据变成如下所示,可以看出,表中已经没有了重复记录,但对于删除前的多条重复数据,还保留了其中的一条:

2819b1b5d13be4d854b38dcb1f44ae1f.png

、使用子查询

使用GROUP BY加上HAVING COUNT的条件判断,可以找出重复的记录,同时,在删除的时候排除掉id最大的那条记录,这样也可以达到目的:

DELETE FROM t_customer WHERE (cust_name,gender,email) IN 
 (SELECT cust_name,gender,email FROM(
  SELECT cust_name,gender,email FROM t_customer
  GROUP BY cust_name,gender,email
  HAVING COUNT(*) > 1) t1)
AND id NOT IN
 (SELECT id FROM(SELECT MAX(id) id 
FROM t_customer GROUP BY cust_name,gender,email
 HAVING COUNT(*) > 1) t2)

这种方式相对比较复杂,嵌套较多,不如第一种方式那样简洁。

另外,上面的sql仅供参考,如果在正式库中执行,一定要做好充足的前期测试工作,以及数据库的备份操作,以便造成数据误删的情况,请务必小心。

都看到这里了,请帮忙一键三连啊,也就是点击文末的在看、点赞、分享,这样会让我的文章让更多人看到,也会大大地激励我进行更多的输出,谢谢!

推荐阅读:

一条sql搞定这个需求,面试官直呼内行

MySQL如何进行表之间的关联更新

高频面试题:多线程顺序打印ABC字符20次

一网打尽:MySQL索引失效的场景大搜罗

这个设计模式的用法,一般人我不告诉他

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/921723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

问道管理:证券代码是什么?有什么用?

交流炒股经历时&#xff0c;有些股民一时忘了股票发行公司的全称&#xff0c;会直接报一串数字来代替&#xff0c;这串数字的内容是证券代码&#xff0c;那么&#xff0c;证券代码是什么&#xff1f;它又起什么作用&#xff1f;关于这些&#xff0c;为大家准备了以下参考内容。…

Python-主线程控制子线程-4

需求&#xff1a;在Python-主线程控制子线程-3的基础上&#xff0c;新增使用UDP接收指令功能&#xff0c;代替从键盘输入指令 # 修改后的程序&#xff0c;主线程可以获取子线程的结果 import threading import time import queue import tracebackfrom loguru import logger i…

齐聚众力,中国移动以“百川”定乾坤

近日&#xff0c;由工业和信息化部、宁夏回族自治区人民政府主办的2023中国算力大会在宁夏银川举办。中国移动党组书记、董事长杨杰参加开幕式&#xff0c;并在大会主论坛作题为《算网筑基锻引擎 数实融合创未来》的主旨演讲。在演讲中&#xff0c;杨杰表示&#xff1a;未来&am…

牛客OJ 把字符串转换成整数

⭐️ 题目描述 &#x1f31f; O链接 https://www.nowcoder.com/practice/1277c681251b4372bdef344468e4f26e?tpId13&&tqId11202&rp6&ru/activity/oj&qru/ta/coding-interviews/question-ranking 思路&#xff1a; 首先需要检查第一位是否有符号位&#x…

【EA-ISET协会】Elsevier|2区智慧农业类SCIEI, 进展顺,3个月左右录用~

一、期刊简介 2区智慧农业类SCI&EI 【期刊简介】IF: 3.0-4.0, JCR2区, 中科院4区&#xff1b; 【检索情况】SCI&EI双检&#xff0c;正刊&#xff1b; 【终审周期】走期刊部系统&#xff0c;3个月左右录用&#xff1b; 二、征稿范围 大数据和遥感技术在智慧农业中…

Blender文件云端GPU渲染

本文介绍如何在 GPU云平台vast.ai 上渲染Blender动画的技术指南&#xff0c;假设你已使用 vast.ai 并知道如何启动实例&#xff0c;这里的重要步骤是为实例选择正确的映像。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 使用 nvidia/cuda:11.4.1-cudnn8-devel-ubuntu2…

C++信息学奥赛1138:将字符串中的小写字母转换成大写字母

#include<bits/stdc.h> using namespace std; int main() {string arr;// 输入一行字符串getline(cin, arr);for(int i0;i<arr.length();i){if(arr[i]>97 and arr[i]<122){char aarr[i]-32; // 将小写字母转换为大写字母cout<<a; // 输出转换后的字符}els…

AI教学赋能计划(大模型特辑)2023秋季学期启动申请!

AI教学赋能计划是由百度飞桨发起&#xff0c;面向高校提供产教融合人才培养方案&#xff0c;一站式助力高校复合型人才培养&#xff0c;截至目前已经培养5200名AI专业师资&#xff0c;助力484所高校开设人工智能与AIX特色课程。 2023年随着文心一言等预训练大语言模型发展&…

中国平台软件市场研究报告:OceanBase为金融行业国产分布式数据库销售额第一

近日&#xff0c;《2022-2023年度中国平台软件市场研究报告》&#xff08;以下简称“报告”&#xff09;发布&#xff0c;报告对包括数据库、操作系统等在内的平台软件市场发展进行了分析。报告指出&#xff0c;在对平台软件需求增长最快的金融行业&#xff0c;OceanBase已占据…

一文看懂 ISP pipeline

文章目录 概述什么是ISPISP实现方案 ISP PipelineISP输入行缓冲数据对齐 难理解的关键算法WDR图像压缩色调映射 Tone MappingRAW域处理镜头阴影校正 LSC降噪&#xff1a;空域滤波器 Spatial FilterBayer Demosaic 概述 什么是ISP 主流的CMOS和CCD sensor基本都是输出Bayer Mo…

金佰利Kimberly-Clark直连EDI解决方案

Kimberly-Clark 金佰利是全球健康卫生护理领域的领导者。 成立于1872年的金佰利公司是全球健康卫生护理领域的行业领导者。个人健康护理用品、家庭生活用纸和商用消费产品是金佰利公司三大核心业务。金佰利在全球35个国家设有生产设施&#xff0c;产品销往超过175个国家和地区…

真机和开发者工具如何模拟虚拟定位

二、如何模拟虚拟定位 微信开发者如何模拟虚拟定位 1、打开微信开发者工具 2、打开调试器 3、切换到Sensor 4、勾选Enable 5、填写经纬度数值&#xff0c;在线解析经纬度链接&#xff1a;【经纬度查询】在线地图经度纬度查询|经纬度地名坐标转换 6、重新编译&#xff0c…

8月23日上课内容 第二章 MySQL数据库管理

本章结构&#xff1a; 数据库基本操作 查看数据库的结构 查看数据库列表信息 show database 查看数据库中的表信息 use 数据库名#切换到数据库中 show tables show tables in mysgl 显示数据表的结构(字段) describe user; Field:字段名称type: 数据类型Nul1 :是否允许为空Key…

c++多种情况不同概率下,在范围内使用随机数

多种情况不同概率下&#xff0c;在范围内使用随机数。比如有5种情况&#xff0c;每种情况的概率不相同&#xff0c;有的概率为25&#xff0c;有的为15. 使用random库的函数来生成随机数。 std::random_device rd; //产生随机数种子 std::mt19937 gen(rd()); //生成伪随机数&a…

VScode 编辑器报错: ‘HelloWorld‘ is declared but its value is never read.

.vue文件被标识红色波浪线&#xff1b;提示&#xff1a; HelloWorld is declared but its value is never read. 问题原因&#xff1a; 因为vue3已经不支持vetur插件。 1、在扩展里面进行搜索Vetur插件&#xff0c;进行禁用或卸载&#xff1b; 2、在 VScode扩展里面搜索并下载…

NO.08 MyBatis创建逆向工程

目录 1、前言 2、添加依赖和插件 3、创建MyBatis的核心配置文件 4、创建逆向工程的配置文件 5、执行MBG插件的generate目标 1、前言 工程的创建有正向工程和逆向工程之分。正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表&#xff0c;如…

Vue3+Pinia+Koa+Three.js 全栈电商项目总结复盘

前言 前几天一个朋友去义乌旅游&#xff0c;带回来很多小商品&#xff0c;就是一整个物美价廉&#xff0c;但是为什么线下购物和网购有的时候差别这么大&#xff08;网购经常要退换货啊&#x1f62d;&#x1f62d;&#x1f62d;&#xff09;&#xff0c;为此我萌生了一个想法&…

SQL注入之宽字节注入

文章目录 宽字节注入是什么&#xff1f;注入练习让转义符失效联合查询 代码审计 宽字节注入是什么&#xff1f; 宽字节注入准确来说不是注入手法&#xff0c;而是另外一种比较特殊的情况。宽字节注入的目的是绕过单双引号转义。 宽字节注入是一种绕过单双引号转义的手段&#x…

数学——七桥问题——图论

当涉及数学&#xff0c;有很多不同的话题可以讨论。你是否有特定的数学领域、概念或问题想要了解更多&#xff1f;以下是一些常见的数学领域和主题&#xff0c;你可以选择一个或者告诉我你感兴趣的具体内容&#xff0c;我将很乐意为你提供更多信息&#xff1a; 代数学&#xff…

嵌入式Linux开发实操(十):ADC接口开发

#前言 ADC就是模数转换,可以用来接一些模拟量设备,所谓模拟量就是波形不是方波而是各种包络形状的波形的信号,比如电压、电流等电信号或压力、温度、湿度、位移、声音等非电信号,ADC就是将这些信号转换为数字方波信号,以便于信息传递的。 #ADC硬件设计 key按键连接了AD…