SQL中删除重复数据问题

简介: SQL中删除重复数据问题

需求分析

数据库中存在重复记录,删除保留其中一条(是否重复判断基准为多个字段)


解决方案

碰到这样的问题我们先分解步骤来看

  • 创建测试数据
  • 找到重复的数据
  • 删除重复的数据并且保留一行


创建测试数据

我们创建一个人员信息表并在里面插入一些重复的数据。

CREATETABLE [dbo].[Person](
[ID] [INT] IDENTITY(1,1) NOTNULL,
[Name] [VARCHAR](20) NULL,
[Age] [INT] NULL,
[Address] [VARCHAR](20) NULL,
[Sex] [CHAR](2) NULL
);

SET IDENTITY_INSERT [dbo].[Person] ON;
INSERTINTO [dbo].[Person] (ID,Name,Age,Address,Sex)
VALUES
( 1, '张三', 18, '北京路18号', '男' ),
( 2, '李四', 19, '北京路29号', '男' ),
( 3, '王五', 19, '南京路11号', '女' ),
( 4, '张三', 18, '北京路18号', '男' ),
( 5, '李四', 19, '北京路29号', '男' ),
( 6, '张三', 18, '北京路18号', '男' ),
( 7, '王五', 19, '南京路11号', '女' ),
( 8, '马六', 18, '南京路19号', '女' );
SET IDENTITY_INSERT [dbo].[Person]  OFF;

(提示:可以左右滑动代码)


建立好测试数据如下:

image.png

我们发现除了自增长ID不同以为,有几条其他字段都重复的数据出现,符合我们的需求。


找出重复的数据

SELECTMAX(ID) ID  ,
Name,Age,Address,Sex
FROM dbo.Person
GROUPBYName,Age,Address,Sex
HAVINGCOUNT(1)>1


HAVING将分组后统计出来的数量大于1的数据行,就是我们要找的重复数据:

image.png

上面用Max函数或者Min函数均可,只是为了保证取出来的数据的唯一性。


删除重复的数据

其实我们数据库中最后要保留的结果就是第二步中查询出来的数据,我们把其他的数据删除即可。怎么删除呢?我们使用ID来排除。

DELETE  FROM Person
WHERE  EXISTS
(
SELECT * FROM (
SELECT
MAX(ID) ID,
Name,Age,Address,Sex
FROM dbo.Person
GROUPBYName,Age,Address,Sex
HAVINGCOUNT(1)>1) T
WHERE Person.Name=T.Name
AND Person.Age=T.Age
AND Person.Address=T.Address
AND Person.Sex=T.Sex
AND Person.ID<T.ID--如果上面使用MIN函数,这里就要改成>
)

执行完后重新查询Person表结果如下:

image.png

马六因为只有一条记录,所以没有参与去重,直接显示。


今天的案例分享结束,小伙伴们可以自己动手尝试一下,兴许工作中也会遇到类似问题。如果你在公众中遇到一些有趣的问题也可以发送给我。

相关文章
|
22天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL隐式游标:数据的“自动导游”与“轻松之旅”
【4月更文挑战第19天】Oracle PL/SQL中的隐式游标是自动管理的数据导航工具,简化编程工作,尤其适用于简单查询和DML操作。它自动处理数据访问,提供高效、简洁的代码,但不适用于复杂场景。显式游标在需要精细控制时更有优势。了解并适时使用隐式游标,能提升数据处理效率,让开发更加轻松。
|
22天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
4天前
|
SQL API 数据库
在Python中获取筛选后的SQL数据行数
在Python中获取筛选后的SQL数据行数
12 1
|
5天前
|
SQL 分布式计算 数据可视化
数据分享|Python、Spark SQL、MapReduce决策树、回归对车祸发生率影响因素可视化分析
数据分享|Python、Spark SQL、MapReduce决策树、回归对车祸发生率影响因素可视化分析
|
10天前
|
SQL 机器学习/深度学习 数据采集
数据分享|SQL Server、Visual Studio、tableau对信贷风险数据ETL分析、数据立方体构建可视化
数据分享|SQL Server、Visual Studio、tableau对信贷风险数据ETL分析、数据立方体构建可视化
|
11天前
|
SQL Oracle 关系型数据库
利用 SQL 注入提取数据方法总结
利用 SQL 注入提取数据方法总结
|
11天前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之在DataWorks的数据开发模式中,在presql和postsql中支持执行多条SQL语句如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
39 1
|
12天前
|
SQL 机器学习/深度学习 算法
SQL SERVER ANALYSIS SERVICES决策树、聚类、关联规则挖掘分析电商购物网站的用户行为数据
SQL SERVER ANALYSIS SERVICES决策树、聚类、关联规则挖掘分析电商购物网站的用户行为数据
|
12天前
|
SQL 机器学习/深度学习 数据挖掘
SQL Server Analysis Services数据挖掘聚类分析职业、地区、餐饮消费水平数据
SQL Server Analysis Services数据挖掘聚类分析职业、地区、餐饮消费水平数据
|
15天前
|
SQL Java 数据库
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
17 1