`

Oracle删除重复记录的几种方式

 
阅读更多

原文链接: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中的重复记录,并分析其...

    oracle中如何删除重复的记录

    以上介绍了两种在Oracle数据库中删除重复记录的方法。第一种方法适用于数据量较小的情况,第二种方法则更适合处理大数据量的场景。实际应用时,可以根据具体情况选择合适的方法。需要注意的是,在进行删除操作之前...

    oracle删除重复记录

    删除重复记录有多种方法,下面介绍几种常用的策略。 #### 1. 使用子查询删除重复记录 根据提供的部分代码示例,可以构建一种删除重复记录的方法。这种方法通过子查询来确定哪些记录是重复的,然后只保留一条记录。...

    oracle下如何删除重复数据的几种方法

    无论是部分字段重复还是完全重复的记录,都可以通过创建临时表的方式提高删除重复记录的效率。此外,在处理重复数据时,还应考虑到保留最新或最旧记录的需求,利用`ROWID`等特性可以轻松实现这一点。总之,合理地...

    Oracle查询重复数据与删除重复记录方法(txt)

    ### Oracle查询重复数据与删除重复记录方法 在Oracle数据库中,有时我们需要找出并处理重复的数据。这不仅可以提高数据质量,还能提升查询效率。本文将详细介绍几种常用的查询和删除Oracle数据库中重复记录的方法。...

    wxh Oracle数据库删除重复记录的方法

    以下将详细介绍几种在Oracle数据库中有效删除重复记录的技术。 ### 1. 使用临时表删除重复记录 这种方法涉及创建一个临时表来存储唯一的数据行,然后清空原始表,并重新插入从临时表获取的数据。具体步骤如下: 1...

    Oracle查询重复数据与删除重复记录方法

    ### Oracle查询重复数据与删除重复记录方法 #### 一、查询重复数据 ##### 1. 使用ROWID方法 ROWID是Oracle中一个特殊的数据类型,它代表了表中每一条记录在物理存储上的唯一地址。利用ROWID可以非常高效地查询和...

    oracle查询重复数据方法

    这种方法可以根据 peopleId 字段来判断重复记录,并删除重复记录中除了 rowid 最小的记录以外的所有记录。 方法三:使用多个字段 第三种方法是使用多个字段来查询重复数据。例如,下面的语句可以查询出表中多余的...

    Oracle中用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删除重复数据的sql语句

    根据给定文件中的标题、描述、标签以及部分内容,本文将详细介绍在Oracle数据库中删除重复数据的几种方法。这些方法利用了ROWID、GROUP BY、DISTINCT等关键字来实现数据去重的功能。 ### 1. 使用ROWID进行去重 ...

    如何高效删除Oracle数据库中的重复数据

    - **解释**:这段代码通过ROWID来找出重复记录,并仅返回每个重复组中的非最大ROWID记录,即需要被删除的记录。 3. **创建临时表** - **原理**:先创建一个临时表存储重复记录的关键信息,再基于此表进行删除操作...

    oracle数据库各种删除重复数据方法

    本文将详细介绍几种在Oracle数据库中删除重复数据的有效方法。 #### 方法一:基于ID删除重复行 此方法适用于只需要考虑单一字段(如ID)的情况,通过找出具有相同ID但非最小ROWID的记录来进行删除。 **SQL语句:*...

    删除重复数据的一种高效的方法(oracle)

    在Oracle数据库管理中,删除重复数据是一个常见的需求,特别是在数据清洗和优化数据库性能时。本文将探讨三种不同的方法来高效地删除`demo`表中的重复数据,并分析它们的执行时间和适用场景。 方法一: 该方法基于...

    ORACLE查询删除重复记录三种方法

    比如现在有一人员表 (表名:peosons) 若想将姓名、身份证号、住址这三个字段完全相同的记录...几个删除重复记录的SQL语句 1.用rowid方法 2.用group by方法 3.用distinct方法 1。用rowid方法 据据oracle带的rowid属

    在SQL中删除重复记录多种方法

    在SQL中删除重复记录是一个常见的需求,特别是在处理大型数据集时。本文将介绍几种有效的方法,以帮助你在遇到重复记录问题时能有效地清理数据。我们将以Oracle数据库为例,但这些方法在其他SQL数据库系统中也具有...

    在oracle查询删除一个表编码中相同的记录

    这个SQL语句分为两部分:查询和删除重复记录。 - **查询部分**: - 首先,它使用 `GROUP BY` 子句按 `STEEL_GRADE_ID` 分组,并统计每个分组中记录的数量。 - 然后,它使用 `HAVING COUNT(*) &gt; 1` 来筛选出重复的...

    Oracle里取随机数的几种具体的方法

    Oracle 里取随机数的几种具体的方法 Oracle 是一个功能强大的关系数据库管理系统,它提供了多种方法来生成随机数。随机数生成是许多应用程序的重要组件,例如抽奖活动、验证码生成、密码生成等。在本文中,我们将...

    oracle快速删除重复的记录

    本文将探讨几种针对大规模数据表删除重复记录的方法,并分析它们的优缺点。 首先,我们假设有一个名为Tbl的表,包含三列col1,col2,col3,其中col1和col2构成主键,并且在col1和col2上都建立了索引。当表中出现...

Global site tag (gtag.js) - Google Analytics