SQL语句 删除掉重复项只保留一条

本文提供了一套完整的SQL语句方案,用于查找并删除数据库表中的重复记录,包括针对单个字段及多个字段的情况,并附带了更新字段内容的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用SQL语句,删除掉重复项只保留一条

在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 
select * from people 
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 
delete from people 
where   peopleName in (select peopleName    from people group by peopleName      having count(peopleName) > 1) 
and   peopleId not in (select min(peopleId) from people group by peopleName     having count(peopleName)>1) 

3、查找表中多余的重复记录(多个字段) 
select * from vitae a 
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录 
delete from vitae a 
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1) 

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录 
select * from vitae a 
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)   

6.消除一个字段的左边的第一位:

update tableName set [Title]=Right([Title],(len([Title])-1)) where Title like '村%'

7.消除一个字段的右边的第一位:

update tableName set [Title]=left([Title],(len([Title])-1)) where Title like '%村'

8.假删除表中多余的重复记录(多个字段),不包含rowid最小的记录 
update vitae set ispass=-1
where peopleId in (select peopleId from vitae group by peopleId

### 如何使用 SQL 删除重复记录并仅保留一条 在实际开发中,删除重复记录并只保留一条是一种常见的需求。以下是几种常见且高效的方法来完成这一任务。 #### 方法一:利用子查询和聚合函数 通过 `GROUP BY` 和 `MIN()` 函数可以找到每组中的唯一记录,并将其余的重复记录标记为待删除对象。具体实现如下: ```sql DELETE FROM table_name WHERE id NOT IN ( SELECT MIN(id) FROM table_name GROUP BY duplicate_column ); ``` 此方法的核心在于先按指定列(如 `duplicate_column`)分组,再选取每一组中具有最小 ID 的记录作为保留对象[^4]。其他未被选中的记录则会被删除。 #### 方法二:窗口函数配合 CTE 或子查询 对于支持窗口函数的数据库(如 MySQL 8.0+、PostgreSQL 等),可以通过 `ROW_NUMBER()` 来分配序号给每条记录,从而更容易识别哪些是冗余数据。 ```sql WITH RankedRecords AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY duplicate_column ORDER BY id ASC) AS rn FROM table_name ) DELETE FROM table_name WHERE id IN ( SELECT id FROM RankedRecords WHERE rn > 1 ); ``` 这里的关键点是在分区内的每条记录前加上唯一的行号(`rn`)。如果某条记录的行号大于 1,则表示它是重复项,应予以移除[^3]。 #### 方法三:直接使用 DELETE 结合嵌套查询 某些情况下可以直接编写更简洁的 SQL 表达式来进行清理工作。例如,在 MySQL 中可采用以下方式一次性解决问题: ```sql DELETE t1 FROM table_name t1 JOIN table_name t2 ON t1.duplicate_column = t2.duplicate_column AND t1.id > t2.id; ``` 该语句通过自连接的方式比较两条记录之间的关系,当发现当前行与其他任何已有行相比其主键更大时即认为它属于多余副本而执行清除动作[^5]。 以上三种方案各有优劣,请根据实际情况选择最适合的一种实施策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值