假设有一张表,有字段ID(主键),A,B,C,D;如果字段A的值和字段B的值和上一条(或者某一条)记录都相同的话就算重复,就需要删除其中重复的记录,只保留一条不重复的记录,请问该如何写这条SQL?

该博客介绍了如何在MySQL中删除具有重复A和B字段值的记录,仅保留一条不重复的记录。首先,创建了一个名为tmp的表并插入了测试数据。然后,展示了在尝试删除重复记录时遇到的错误及其解决方法,即通过在外层添加子查询来避免更新时的冲突。
摘要由CSDN通过智能技术生成

创建表

CREATE TABLE tmp
(id INT PRIMARY KEY,
A VARCHAR(5),
B VARCHAR(5),
C VARCHAR(5),
D VARCHAR(5)
);

插入测试数据

INSERT INTO tmp
SELECT 1 ,‘A1’,‘B1’,‘C1’,‘D1’
UNION ALL
SELECT 2 ,‘A1’,‘B1’,‘C2’,‘D2’
UNION ALL
SELECT 3,‘A2’,‘B2’,‘C3’,‘D3’
UNION ALL
SELECT 4 ,‘A2’,‘B2’,‘C4’,‘D4’
UNION ALL
SELECT 5 ,‘A3’,‘B3’,‘C5’,‘D5’
UNION ALL
SELECT 6 ,‘A3’,‘B3’,‘C6’,‘D6’
UNION ALL
SELECT 7 ,‘A3’,‘B3’,‘C7’,‘D7’

在这里插入图片描述

清除重复的记录

以下的思想没有问题,但是直接执行会报错:

DELETE FROM tmp WHERE id NOT IN (SELECT MAX(id) AS F FROM tmp GROUP BY A,B)

报错:大概意思是不能先select出同一表中的某些值,再update这个表。

You can’t specify target table ‘tmp’ for update in FROM clause

在子查询外再包一层查询就可以了:

DELETE FROM tmp WHERE id NOT IN (SELECT f FROM (SELECT MAX(id) AS F FROM tmp GROUP BY A,B) t)

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值