原文链接:http://www.javaarch.net/jiagoushi/706.htm
Oracle删除重复记录的几种方式 如果把一个文件多次导入数据库,可能会引入重复记录,那么有哪些方法可以删除重复记录呢? REATE TABLE tbl_test( SER_NO NUMBER, FST_NM VARCHAR2(30), DEPTID NUMBER, CMNT VARCHAR2(30)); INSERT INTO tbl_test VALUES(1, 'aaaaa', 2004, 'xxx'); INSERT INTO tbl_test VALUES(2, 'bbbbb', 2005, 'yyy'); INSERT INTO tbl_test VALUES(1, 'aaaaa', 2004, 'xxx'); INSERT INTO tbl_test VALUES(1, 'aaaaa', 2004, 'xxx'); INSERT INTO tbl_test VALUES(3, 'ccccc', 2005, 'zzz'); INSERT INTO tbl_test VALUES(2, 'bbbbb', 2005, 'yyy'); 1.Using MIN(rowid) 最常用的方法,但是数据量大的话执行会很长时间 DELETE FROM tbl_test WHERE ROWID NOT IN (SELECT MIN (ROWID) FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt); 2.Using MIN(rowid) & Join 跟第一条差不多 DELETE FROM tbl_test t WHERE t.ROWID NOT IN (SELECT MIN (b.ROWID) FROM tbl_test b WHERE b.ser_no = t.ser_no AND b.fst_nm = t.fst_nm AND b.deptid = t.deptid AND b.cmnt = t.cmnt); 3.Using Subquery DELETE FROM tbl_test WHERE ser_no IN (SELECT ser_no FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt HAVING COUNT (*) > 1) AND fst_nm IN (SELECT fst_nm FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt HAVING COUNT (*) > 1) AND deptid IN (SELECT deptid FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt HAVING COUNT (*) > 1) AND cmnt IN (SELECT cmnt FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt HAVING COUNT (*) > 1) AND ROWID NOT IN (SELECT MIN (ROWID) FROM tbl_test GROUP BY ser_no, fst_nm, deptid, cmnt HAVING COUNT (*) > 1) 4. Using Nested Subqueries DELETE FROM tbl_test a WHERE (a.ser_no, a.fst_nm, a.deptid, a.cmnt) IN (SELECT b.ser_no, b.fst_nm, b.deptid, b.cmnt FROM tbl_test b WHERE a.ser_no = b.ser_no AND a.fst_nm = b.fst_nm AND a.deptid = b.deptid AND a.cmnt = b.cmnt AND a.ROWID > b.ROWID); 5. Using Analytic Fucntions: 对于大表这是最有效的方法 DELETE FROM tbl_test WHERE ROWID IN (SELECT rid FROM (SELECT ROWID rid, ROW_NUMBER () OVER (PARTITION BY ser_no, fst_nm, deptid, cmnt ORDER BY ROWID) rn FROM tbl_test)WHERE rn <> 1); 6. CREATE-DROP-RENAME 对资源使用比较合理,特别对于大表。但是如果需要回滚则会产生大量undo日志信息。 CREATE TABLE tbl_test1 NOLOGGING AS SELECT tbl_test .* FROM tbl_test tbl_test WHERE ROWID IN (SELECT rid FROM (SELECT ROWID rid, ROW_NUMBER() OVER (PARTITION BY ser_no, fst_nm, deptid, cmnt ORDER BY ROWID) rn FROM tbl_test) WHERE rn=1); DROP TABLE tbl_test; --drop the original table with lots of duplicate RENAME tbl_test1 TO tbl_test; -- your original table without duplicates.
相关推荐
### Oracle删除重复记录性能分析 #### 一、背景与需求 在数据库管理中,经常会遇到数据清理的需求,尤其是在Oracle数据库中处理重复记录时。本文旨在通过对比几种不同的方法来删除Oracle中的重复记录,并分析其...
以上介绍了两种在Oracle数据库中删除重复记录的方法。第一种方法适用于数据量较小的情况,第二种方法则更适合处理大数据量的场景。实际应用时,可以根据具体情况选择合适的方法。需要注意的是,在进行删除操作之前...
删除重复记录有多种方法,下面介绍几种常用的策略。 #### 1. 使用子查询删除重复记录 根据提供的部分代码示例,可以构建一种删除重复记录的方法。这种方法通过子查询来确定哪些记录是重复的,然后只保留一条记录。...
无论是部分字段重复还是完全重复的记录,都可以通过创建临时表的方式提高删除重复记录的效率。此外,在处理重复数据时,还应考虑到保留最新或最旧记录的需求,利用`ROWID`等特性可以轻松实现这一点。总之,合理地...
### Oracle查询重复数据与删除重复记录方法 在Oracle数据库中,有时我们需要找出并处理重复的数据。这不仅可以提高数据质量,还能提升查询效率。本文将详细介绍几种常用的查询和删除Oracle数据库中重复记录的方法。...
以下将详细介绍几种在Oracle数据库中有效删除重复记录的技术。 ### 1. 使用临时表删除重复记录 这种方法涉及创建一个临时表来存储唯一的数据行,然后清空原始表,并重新插入从临时表获取的数据。具体步骤如下: 1...
### Oracle查询重复数据与删除重复记录方法 #### 一、查询重复数据 ##### 1. 使用ROWID方法 ROWID是Oracle中一个特殊的数据类型,它代表了表中每一条记录在物理存储上的唯一地址。利用ROWID可以非常高效地查询和...
这种方法可以根据 peopleId 字段来判断重复记录,并删除重复记录中除了 rowid 最小的记录以外的所有记录。 方法三:使用多个字段 第三种方法是使用多个字段来查询重复数据。例如,下面的语句可以查询出表中多余的...
针对不同的场景,可以采取以下几种策略来删除重复记录: 1. **基于Group By和Min/Max Rowid** ```sql DELETE FROM cz WHERE (c1, c10, c20) IN (SELECT c1, c10, c20 FROM cz GROUP BY c1, c10, c20 HAVING COUNT...
根据给定文件中的标题、描述、标签以及部分内容,本文将详细介绍在Oracle数据库中删除重复数据的几种方法。这些方法利用了ROWID、GROUP BY、DISTINCT等关键字来实现数据去重的功能。 ### 1. 使用ROWID进行去重 ...
- **解释**:这段代码通过ROWID来找出重复记录,并仅返回每个重复组中的非最大ROWID记录,即需要被删除的记录。 3. **创建临时表** - **原理**:先创建一个临时表存储重复记录的关键信息,再基于此表进行删除操作...
本文将详细介绍几种在Oracle数据库中删除重复数据的有效方法。 #### 方法一:基于ID删除重复行 此方法适用于只需要考虑单一字段(如ID)的情况,通过找出具有相同ID但非最小ROWID的记录来进行删除。 **SQL语句:*...
在Oracle数据库管理中,删除重复数据是一个常见的需求,特别是在数据清洗和优化数据库性能时。本文将探讨三种不同的方法来高效地删除`demo`表中的重复数据,并分析它们的执行时间和适用场景。 方法一: 该方法基于...
比如现在有一人员表 (表名:peosons) 若想将姓名、身份证号、住址这三个字段完全相同的记录...几个删除重复记录的SQL语句 1.用rowid方法 2.用group by方法 3.用distinct方法 1。用rowid方法 据据oracle带的rowid属
在SQL中删除重复记录是一个常见的需求,特别是在处理大型数据集时。本文将介绍几种有效的方法,以帮助你在遇到重复记录问题时能有效地清理数据。我们将以Oracle数据库为例,但这些方法在其他SQL数据库系统中也具有...
这个SQL语句分为两部分:查询和删除重复记录。 - **查询部分**: - 首先,它使用 `GROUP BY` 子句按 `STEEL_GRADE_ID` 分组,并统计每个分组中记录的数量。 - 然后,它使用 `HAVING COUNT(*) > 1` 来筛选出重复的...
Oracle 里取随机数的几种具体的方法 Oracle 是一个功能强大的关系数据库管理系统,它提供了多种方法来生成随机数。随机数生成是许多应用程序的重要组件,例如抽奖活动、验证码生成、密码生成等。在本文中,我们将...
本文将探讨几种针对大规模数据表删除重复记录的方法,并分析它们的优缺点。 首先,我们假设有一个名为Tbl的表,包含三列col1,col2,col3,其中col1和col2构成主键,并且在col1和col2上都建立了索引。当表中出现...