首页 > 数据库 >SQL中如何删除重复数据,只保留其中一行

SQL中如何删除重复数据,只保留其中一行

时间:2022-10-25 17:13:44浏览次数:51  
标签:Name 删除 18 Age Address 一行 Person SQL ID

SQL专栏

SQL数据库基础知识汇总

SQL数据库高级知识汇总

需求分析

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

解决方案

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

创建测试数据

找到重复的数据

删除重复的数据并且保留一行

创建测试数据

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


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

SET IDENTITY_INSERT [dbo].[Person] ON;
INSERT INTO [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;

建立好测试数据如下:

 

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

找出重复的数据

SELECT MAX(ID) ID ,
Name,Age,Address,Sex
FROM dbo.Person
GROUP BY Name,Age,Address,Sex
HAVING COUNT(1)>1

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

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

删除重复的数据

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


DELETE FROM Person
WHERE EXISTS
(
SELECT * FROM (
SELECT
MAX(ID) ID,
Name,Age,Address,Sex
FROM dbo.Person
GROUP BY Name,Age,Address,Sex
HAVING COUNT(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表结果如下:

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

 

标签:Name,删除,18,Age,Address,一行,Person,SQL,ID
From: https://www.cnblogs.com/lcl9668/p/16825508.html

相关文章

  • Cypher Sql
    CypherSqlSQL查询SQL中很容易,只需从products表中查询所有数据。SELECTp.*FROMproductsaspCypher查询在Cypher中,您只需匹配一个简单的模式:查询带有标签:Produc......
  • MySQL 通用查询日志与慢查询日志
    MySQL中的日志包括:错误日志、二进制日志、通用查询日志、慢查询日志等等。这里主要介绍下比较常用的两个功能:通用查询日志和慢查询日志。1)通用查询日志:记录建立的客户端连接......
  • mysql数据导出
    #导出数据到本地文件mysqldump-uroot-p我的密码-T/data/test1010qgdatacompany_lawsuit--fields-terminated-by='|'--lines-terminated-by='\n'-p我的密码#密......
  • mysql修改用户开放ip权限
    远程连接不上mysql有很多原因:服务器防火墙,mysql默认绑定本地ip,访问用户默认绑定本地ip防火墙的原因需要配置策略或者关闭mysql绑定本地ip需要配置mysql用户的需要修改用......
  • 用SQL语句,删除掉重复项只保留一条
    在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopl......
  • Mysql rank排名函数
    https://www.jianshu.com/p/776151cbba03https://blog.csdn.net/m0_60196931/article/details/125214918......
  • mysql08--索引管理
    一、索引理论ps:数据都是存在于硬盘上的,查询数据不可避免的需要进行IO操作#索引:就是一种数据结构,类似于书的目录。意味着以后在查询数据的应该先找目录再找数据,而......
  • 发现一款 SQL 自动检查神器,再也不用担心 SQL 出错了!
    YearningMYSQL是一个SQL语句审核平台。提供查询审计,SQL审核等多种功能,支持Mysql,可以在一定程度上解决运维与开发之间的那一环,功能丰富,代码开源,安装部署容易!开源地址h......
  • mybatis typehandler适配postgresql中的point数组数据类型
    mybatistypehandler适配postgresql中的point数组数据类型importlombok.extern.slf4j.Slf4j;importorg.apache.ibatis.type.BaseTypeHandler;importorg.apache.ibat......
  • SQLite REAL数据类型值比较问题
    SQLiteREAL数据类型值比较问题数据类型是REAL的字段,where条件where字段=值查询时,可能查询结果为空,使用whereabs(字段-值)<0.00001查询例子表结构字段名称......