Oracle删除重复记录:实用SQL解决方案

需积分: 11 1 下载量 34 浏览量 更新于2024-09-21 收藏 39KB DOC 举报
"Oracle删除重复记录的多种方法" 在Oracle数据库中,删除重复记录是一个常见的需求,特别是在数据清洗和维护数据一致性时。以下是一些有效的SQL语句示例,用于定位并删除这些重复数据。 1. 用ROWID方法 ROWID是Oracle中的一个特殊属性,它唯一标识表中的每一行。此方法通过比较同一列值的ROWID来找出重复记录,并删除ROWID较小的记录。查询和删除语句如下: - 查询重复记录: ```sql SELECT * FROM table1 a WHERE ROWID != (SELECT MAX(ROWID) FROM table1 b WHERE a.name1 = b.name1 AND a.name2 = b.name2) ``` - 删除重复记录: ```sql DELETE FROM table1 a WHERE ROWID != (SELECT MAX(ROWID) FROM table1 b WHERE a.name1 = b.name1 AND a.name2 = b.name2) ``` 2. 用GROUP BY方法 GROUP BY语句常用于对数据进行分组统计,结合HAVING子句可以找出重复记录。查询和删除语句如下: - 查询重复记录: ```sql SELECT COUNT(num), MAX(name) FROM student GROUP BY num HAVING COUNT(num) > 1 ``` - 删除重复记录: 这个方法不适合直接删除,因为GROUP BY不能与DELETE语句一起使用。通常需要先创建一个新的无重复表,然后清空原表,再插入新表数据: ```sql CREATE TABLE table_new AS SELECT DISTINCT * FROM table1; TRUNCATE TABLE table1; INSERT INTO table1 SELECT * FROM table_new; ``` 3. 用DISTINCT方法 DISTINCT关键字用于消除结果集中的重复行,适用于小型表。这个方法创建一个无重复的新表,然后将新表数据移回原表。操作如下: - 创建新表: ```sql CREATE TABLE table_new AS SELECT DISTINCT * FROM table1; ``` - 清空并重新插入数据: ```sql TRUNCATE TABLE table1; INSERT INTO table1 SELECT * FROM table_new; ``` 4. 基于单个字段查找和删除重复记录 当我们只关注单个字段(如`peopleId`)的重复时,可以使用如下SQL语句: - 查找重复记录: ```sql SELECT * FROM people WHERE peopleId IN (SELECT peopleId FROM people GROUP BY peopleId HAVING COUNT(peopleId) > 1) ``` - 删除重复记录: 这个情况也需要先找到主键(通常是唯一不重复的字段),然后基于该字段进行删除。例如,如果有一个`peopleId_seq`作为自增主键: ```sql DELETE FROM people WHERE peopleId NOT IN (SELECT MIN(peopleId) FROM people GROUP BY peopleId); ``` 请注意,执行这些删除操作前一定要谨慎,最好先备份数据,避免不可逆的数据丢失。同时,对于大型表,应考虑性能因素,可能需要采用更复杂的策略,如分区表或并行处理。