一条SQL语句删除重复的记录

本文介绍了一种使用SQL语句从数据库表中删除重复记录的方法,通过创建一个测试表并插入包含重复项的数据,然后利用自连接的方式实现了仅保留第一条记录的目标。

 

去面试时,被问到用一条SQL语句删除重复的记录,当时做不出来,回头想想,方法如下:

 

新增一个表,用于测试

create table table1 (id int primary key, name char(20) );

 

添加样品记录

insert into table1 values (1,'hello') , (2,'world'), (3,'hello'), (4,'hello'), (5,'world'), (6,'python');

 

删除name相同的记录(保留第一条)

delete t2 from table1 t1, table1 t2 where t1.name=t2.name and t1.id<t2.id;

### 如何使用 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、付费专栏及课程。

余额充值