删除数据表中重复记录
Pet表结构及数据如下(要求删除字段"petName"相同的记录,保留最新一条即可):
+----+---------+---------+
| id | petName | petType |
+----+---------+---------+
| 1 | DODO | cat |
| 2 | MOMO | cat |
| 3 | WQWQ | cat |
| 4 | DODO | cat |
| 5 | WQWQ | cat |
| 6 | MOMO | cat |
+----+---------+---------+
6 rows in set
删除后结果:
+----+---------+---------+
| id | petName | petType |
+----+---------+---------+
| 1 | DODO | cat |
| 2 | MOMO | cat |
| 3 | WQWQ | cat |
+----+---------+---------+
1、not in方式
Delete from t_pet where id not in( select id from t_pet group by petName );
保留重复记录的最后(最新)一条:
Delete from t_pet where id not in( select max(id) from t_pet group by petName );
注:在mysql数据库里上面的方法不可行,会抛出一个1093 - You can't specify target table 't_pet' for update in FROM clause 的错误,(+﹏+)。解决方案之一:我采用的创建临时表的方式,也就是先把查询出来的非重复记录的id放到临时表里,然后再删除,如:
① Drop table if exists temp_pet;
② Create temporary table select max(id) from t_pet group by petName;
③ Delete from t_pet where id not in ( select * from temp_pet );
这里也可以写一个存储过程来实现。
2、Left join 方式
Delete a from t_pet a left join ( select * from t_pet group by petName ) b on a.id = b.id where b.id is null;
以上方式mysql数据库同样有效。
分步骤说明下:
先看left join 查询语句得到的结果是:
+----+---------+---------+------+---------+---------+
| a.id | a.petName | a.petType | b.id | b.petName | b.petType |
+----+---------+---------+------+---------+---------+
| 4 | DODO | cat | NULL | NULL | NULL |
| 5 | WQWQ | cat | NULL | NULL | NULL |
| 6 | MOMO | cat | NULL | NULL | NULL |
+----+---------+---------+------+---------+---------+
至于为啥是这个结果不用我说了吧,以上结果就是重复的记录,可以对照上面的总表比对下!
最后当然就是删除这些记录,因为b.*字段全为null,所以删除a.*字段即可,剩下的就是非重复记录了,如下:
+----+---------+---------+
| id | petName | petType |
+----+---------+---------+
| 1 | DODO | cat |
| 2 | MOMO | cat |
| 3 | WQWQ | cat |
+----+---------+---------+
好了,这里就介绍这两种方法,当然还有很多方法来实现重复记录的删除,有兴趣大家可以网上看看,很多好心人总结了一些不错的方法!
<!--EndFragment-->
<!--EndFragment-->
分享到:
相关推荐
以下是如何使用SQL语句来删除数据表中重复记录的详细步骤。 首先,我们来看一个简单的例子,假设我们有一个名为`Repeat`的数据表,其中存在重复的记录。要删除这些重复的记录,但保留每个唯一组合的最新(最大`id`...
- `DELETE FROM tb_channel a`:指定从表`tb_channel`中删除数据。 - `WHERE a.ROWID IN (SELECT MAX(b.ROWID) FROM tb_channel b WHERE a.policyNo = b.policyNo AND a.classCode = b.classCode)`:通过子查询找...
2. **删除表中多余的重复记录** - **删除单字段重复记录(保留最小ROWID)** ```sql DELETE FROM people WHERE peopleId IN ( SELECT peopleId FROM people GROUP BY peopleId HAVING COUNT(peopleId) > 1 ...
重复数据的存在不仅会占用额外的存储空间,还可能导致数据统计错误、数据分析偏差等问题,因此,有效地删除表中的重复数据是保持数据质量和提高数据库性能的重要环节。本文将详细解析如何在Oracle中删除表中的重复...
在数据库管理与维护的过程中,经常会遇到表中存在重复记录的问题,这不仅会造成数据冗余、浪费存储空间,还可能导致数据分析结果失真。因此,了解如何有效地删除表中的重复数据是一项重要的技能。下面将详细介绍几种...
在SQL Server中,删除数据表中的重复记录是一个常见的需求,特别是在数据清理和数据整合的过程中。以下将详细介绍三种在Sql Server中删除重复记录的方法。 **方法一:基于循环和临时表** 这种方法适用于没有主键...
在SQL中,删除表中的重复记录是一个常见的需求,特别是在数据导入或者数据整合过程中。这个问题可以从两个方面来解决:有主键的情况和无主键的情况。下面将详细解释这两种情况下的处理方法。 一、具有主键的情况 1...
删除数据库中重复记录是数据库管理中一个常见的问题,特别是在数据量庞大的时候。今天,我们将讨论删除数据库中重复记录的经典方法,包括使用 SQL 语句和其他技巧。 查找表中多余的重复记录 要删除数据库中重复...
标题与描述概述的知识点是关于如何使用SQL语句来删除数据库表中的重复记录,这是一个在数据清理和维护数据完整性时非常实用的技术。以下是对给定文件中四种方法的详细解析和扩展,旨在帮助读者深入理解并掌握这些...
在实际操作中,务必小心谨慎,因为删除数据可能会对数据库的完整性和一致性产生影响。定期检查和清理重复数据是保持数据库健康的重要环节,而Access提供了丰富的工具和功能来帮助用户完成这项任务。在使用过程中,...
特别是在大型企业级应用中,由于各种原因(如数据导入错误、系统故障等),数据库表中可能会出现大量的重复记录,这对数据的准确性和系统的性能都会产生负面影响。因此,掌握如何有效地识别并删除这些重复记录显得尤...
这个示例中的 `RemoveDuplicates` 函数接受一个 TDataSet 类型的参数,遍历数据集并删除重复记录。请注意,实际使用时,应考虑事务处理以确保数据一致性,同时可能需要添加错误处理机制来处理可能出现的异常。 ...
在这种方法中,我们首先将重复的记录记入一个临时表temp1,然后将不重复的记录记入另一个临时表temp2,最后删除原表中的重复记录并将temp2中的记录插入回原表。 优点:这种方法可以快速删除重复记录,且对大型...
SQL Server 中删除具有相同 `servid` 的重复记录 **示例**: ```sql DELETE FROM t_serviceitem WHERE servid IN (SELECT servid FROM t_serviceitem GROUP BY servid HAVING COUNT(servid) > 1) AND gid NOT IN ...
在Access中一般只能查找10行大概20条重复记录,这样程序就可以任意指定表及多字段检索重复记录,并把重复的记录移除到一个临时表中,并不是进行真正删除,你可以进行恢复。但是执行第二次查找时则自动删除上次查找的...
当数据表中存在多个字段组成的复合键时,可以使用以下方式查询重复记录: ```sql SELECT * FROM vitae a WHERE (a.peopleId, a.seq) IN ( SELECT peopleId, seq FROM vitae GROUP BY peopleId, seq HAVING ...
这种方法适用于只需要删除重复记录中的某些行的情况。步骤如下: 1. **找出重复的记录**:首先,我们需要找到那些重复的记录。可以通过子查询来实现这一点。 ```sql SELECT age FROM ( SELECT age, COUNT(*) as...