删除重复数据SQL

delete from t_operator_data where (user_id,tele_num) in (select user_id,tele_num from t_operator_data group by user_id,tele_num having count(tele_num) > 1)
AND ROWID NOT IN (SELECT MIN(ROWID) FROM t_operator_data GROUP BY user_id,tele_num HAVING COUNT(*) > 1)
SQL删除重复数据有多种实现方法,以下为你详细介绍: ### 保留重复数据中id最小的记录 如果要删除重复数据,仅保留重复数据中id最小的记录,可以使用如下SQL语句: ```sql DELETE FROM stu WHERE `name` IN (SELECT a.name FROM (SELECT `name` FROM stu GROUP BY `name` HAVING COUNT(*)>1) a) AND id NOT IN (SELECT b.id FROM (SELECT MIN(id) id FROM stu GROUP BY `name` HAVING COUNT(*)>1) b); ``` 此方法先筛选出有重复记录的`name`,再把`id`不在最小`id`集合里的记录删除,从而保留每个`name`下`id`最小的记录[^1]。 ### 根据`name`和`login_date`组合删除重复记录 依据`name`和`login_date`组合来删除重复记录,只保留`id`最小的记录,示例SQL如下: ```sql DELETE FROM table WHERE id NOT IN( SELECT Min(id) as id FROM table GROUP BY name,login_date); ``` 该方法通过`GROUP BY`对`name`和`login_date`分组,选取每组里`id`最小的记录,最后删除`id`不在此集合中的记录[^2]。 ### 基于自连接删除重复记录 借助自连接删除重复记录,示例如下: ```sql -- 先查看表中数据 select * from stu_test; -- 查需要删除重复数据 SELECT id,sname, COUNT(sname) FROM stu_test GROUP BY sname HAVING COUNT(sname) > 1; -- 删除重复的数据 DELETE t1 FROM stu_test t1 INNER JOIN stu_test t2 WHERE t1.id < t2.id AND t1.sname = t2.sname; ``` 此方法先查询出重复的记录,接着通过自连接,把`id`较小的重复记录删除[^3]。 ### 使用临时表去重 使用`DISTINCT`关键字去除重复行,把去重后的结果插入临时表,再删除原始表数据,最后将临时表数据重新插入原始表,示例SQL如下: ```sql -- 创建临时表 SELECT DISTINCT * INTO #TempTable FROM YourTable -- 清空原始表 TRUNCATE TABLE YourTable -- 将临时表中的数据重新插入到原始表中 INSERT INTO YourTable SELECT * FROM #TempTable ``` 这种方法适用于需要彻底去除重复行,且保留去重后所有字段的情况[^4]。 ### 根据单个字段或多个字段删除重复记录 - **根据单个字段删除重复记录**:只保留`rowid`最小的记录,示例如下: ```sql -- 查找表中多余的重复记录 select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) -- 删除表中多余的重复记录 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) ``` - **根据多个字段删除重复记录**:只保留`rowid`最小的记录,示例如下: ```sql -- 查找表中多余的重复记录(多个字段) select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) -- 删除表中多余的重复记录(多个字段) 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) ``` 这些方法通过`GROUP BY`和`HAVING`筛选出重复记录,再删除`rowid`不在最小`rowid`集合里的记录[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值