做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的。这个表的数据是千万级的,而且是生产系统。也就是说,不能把所有的记录都删除,而且必须快速的把重复记录删掉。
对此,总结了一下删除重复记录的方法,以及每种方法的优缺点。
为了陈诉方便,假设表名为Tbl,表中有三列col1,col2,col3,其中col1,col2是主键,并且,col1,col2上加了索引。
1、通过创建临时表
可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:
creat table tbl_tmp (select distinct* from tbl);
truncate table tbl;//清空表记录
insert into tbl select * from tbl_tmp;//将临时表中的数据插回来。
这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。
2、利用rowid
在oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同。SQL语句如下:
delete from tbl where rowid in (select a.rowid from tbl a, tbl b where a.rowid>b.rowid and a.col1=b.col1 and a.col2 = b.col2)
如果已经知道每条记录只有一条重复的,这个sql语句适用。但是如果每条记录的重复记录有N条,这个N是未知的,就要考虑适用下面这种方法了。
3、利用max或min函数
这里也要使用rowid,与上面不同的是结合max或min函数来实现。SQL语句如下
delete from tbl awhere rowid not in (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//这里max使用min也可以
或者用下面的语句
delete from tbl awhere rowid<(select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//这里如果把max换成min的话,前面的where子句中需要把"<"改为">"
跟上面的方法思路基本是一样的,不过使用了group by,减少了显性的比较条件,提高效率。SQL语句如下:
deletefrom tbl where rowid not in (select max(rowid) from tbl tgroup by t.col1, t.col2);
delete from tbl where (col1, col2) in (select col1,col2 from tblgroup bycol1,col2havingcount(*) >1)and rowidnotin(selectnin(rowid)fromtblgroup bycol1,col2havingcount(*) >1)
还有一种方法,对于表中有重复记录的记录比较少的,并且有索引的情况,比较适用。假定col1,col2上有索引,并且tbl表中有重复记录的记录比较少,SQL语句如下4、利用group by,提高效率
分享到:
相关推荐
### 如何高效删除Oracle数据库中的重复数据 在Oracle数据库管理中,经常会出现因各种原因导致的数据重复问题。这些重复数据不仅占用存储空间、降低查询效率,还可能导致数据分析时出现错误的结果。因此,学会如何...
### Oracle删除表中的重复数据方法 在Oracle中删除表中的重复数据,可以采用多种策略,但通常涉及创建一个临时表来保存去重后的数据,然后用这个临时表覆盖原始表。这种方法可以避免直接修改原表带来的风险,确保...
oracle 删除重复数据的几种方法 在 Oracle 中,删除重复的数据是一种常见的操作。delete 操作可以用来删除重复的数据,但是需要根据实际情况选择合适的方法。下面将介绍四种删除重复数据的方法,每种方法都有其优...
在Oracle数据库中,删除重复数据是一项常见的数据清洗任务,尤其当表设计不当时,重复数据可能导致数据不一致和分析错误。以下将详细解释如何在Oracle中处理这两种类型的重复数据问题:部分字段重复和完全重复记录。...
### Oracle 下删除重复数据的方法及分析 #### 一、部分字段重复数据的处理 ##### 查询重复数据 在Oracle数据库中,经常会遇到表中存在部分字段重复的情况。为了找到这些重复的记录,我们可以使用以下SQL语句: `...
本文将深入探讨如何在Oracle数据库中查询重复数据,理解SQL语句背后的逻辑,并掌握其实现方法。 ### Oracle查询重复数据的核心概念 #### 1. 重复数据的定义 在数据库术语中,重复数据通常指的是在数据集中存在一个...
总结起来,删除Oracle数据库中重复数据的方法各有优劣。对于小到中等规模的数据,方法二可能是最佳选择,而对于大规模数据,方法三更为高效。在实际应用中,应根据数据量、并发需求和系统资源来选择合适的方法。同时...
以上几种方法都可以有效地帮助我们查找和删除Oracle数据库中的重复记录。选择哪种方法取决于具体的业务需求和数据规模。ROWID方法适合于快速定位记录;GROUP BY方法可用于统计重复记录的数量;而DISTINCT方法适用于...
1. **更大的备份容量**:Oracle数据库的重复数据删除技术通过识别并消除备份数据中的冗余部分,显著减少了所需的存储空间。在全备份和增量备份中,无论文件内部还是文件之间,甚至是数据块内的重复数据都会被检测并...
### PL/SQL删除Oracle数据库中的重复记录方法详解 在日常的数据库管理与维护工作中,我们经常会遇到需要处理数据表中的重复记录的情况。特别是在大型企业级应用中,由于各种原因(如数据导入错误、系统故障等),...
本文将详细介绍一种高效的方法来删除Oracle数据库中的重复记录,并通过具体的SQL语句示例来帮助读者理解和掌握这种方法。 #### 一、问题背景与目标 在处理大量数据时,重复记录的存在可能会导致数据统计错误、分析...
通过上述方法,我们可以有效地在Oracle数据库中查找和删除重复记录。选择哪种方法取决于具体的业务场景和技术需求。例如,在数据量非常大的情况下,可能更倾向于使用基于Rowid的比较或者临时表法,以减少数据库的...
【文献价值】文章提供了关于如何结合重复数据删除技术优化Oracle数据库备份流程的专业指导,对于IT专业人士来说,这是一个重要的参考文献,可以帮助他们在实际工作中解决类似问题,提升数据库管理的效率和安全性。...
一个低效的方法是直接使用`IN`子句,而高效的方式是先创建一个临时表存储重复数据,然后删除原表中的记录。例如: ```sql CREATE TABLE temp_table AS (SELECT owner, COUNT(*) AS row_num FROM dba_tables GROUP...
- **定义与原理**:全局重复数据消除是一种在多个数据源之间识别和删除重复数据副本的过程。EMC Avamar通过将数据分割成较小的数据段,并在这些段之间查找重复项来实现这一点。 - **技术优势**:这种方法极大地减少...
- **DM (Data Mining)**:从大量数据中发现有用的信息和模式。 - **OEM (Oracle Enterprise Manager)**:用于管理Oracle环境的工具。 #### 2.2 数据仓库软件组件 - **OWB**:提供了图形化界面来创建和管理数据仓库...
- 高效地处理大量重复数据。 - 保留每组中特定字段值最大的记录。 **注意事项:** - 在实际使用前,请确保对数据进行了备份。 - 测试脚本在非生产环境的数据集上,以验证其正确性。 ##### 2.2 脚本二:删除员工表...
"ArcGIS10 删除完全重复线"这个主题涉及到一个常见的数据清洗任务,即识别并移除地图数据中的完全重复线段。ArcGIS10是Esri公司推出的一款强大的桌面GIS软件,它提供了丰富的数据处理工具和功能,包括数据建模和数据...
在Oracle数据库环境中,有时会遇到需要处理重复数据的情况。这些重复的数据可能会导致数据不一致、统计错误等问题。本文将详细探讨如何在Oracle中查询并删除一个表中编码相同的记录。 ### 一、问题背景 假设有一个...