sql语句删除同样记录

本文介绍了一种使用SQL语句删除数据库中重复记录的方法,并对比了MySQL与Oracle数据库的不同实现方式。通过创建临时表来规避MySQL中无法在同一查询中先选择后删除的问题。

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

对数据库中的数据进行管理不外乎CRUD,但在平常的工作中很少涉及到删除记录的时候,因为数据库中的数据获取代价昂贵。但是最近看面试题的时候总是在数据库的试题部分出现用SQL语句删除相同记录的题目,所以看了一下。
创建表
1. 数据库 MySQL
2. 表结构
create table one(
id varchar(32) primary key not null,
a varchar(32),
b varchar(32)
)
3. 添加数据

insert into one(id,a,b) values
('1001','a1','b1'),
('1002','a2','b2'),
('1003','a3','b3'),
('1004','a2','b2'),
('1005','a3','b3')

删除语句
在网上查的时候用一条查询语句
delete from one where id not in (select min(id) from one group by a,b);
这个语句从意思上是对的,但是MySQL试过之后不能执行,会出现一个错误
这里写图片描述
这个问题只出现在MySQL中,意思是不能在同一语句中先查出数据,再update。
解决方式
创建临时表

 create table tmp as select min(id) as col from one group by a,b;
delete from one where id not in (select col from tmp);
drop table tmp;

在Oracle中最上边的一句的删除语句是完全正确的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值