`
sdfiyon
  • 浏览: 22202 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

删除重复的数据

阅读更多

我们经常需要对一些重复数据进行处理,删除重复的数据,只保留一份即可。重复数据的原因很多:

1.应用上事先没有建立有效的唯一约束或主键

2.建立了唯一约束或主键,但是失效了

 

 这里记录一个高效的处理方式,使用建立约束时的exceptions into功能,简单描述如下:

 

--1.构造千万级数据,并插入一些重复数据,共有42条重复,保留一份,则保留21条即可

dingjun123@ORADB> create table t as select * from dba_objects;

Table created.

Elapsed: 00:00:00.29

 

dingjun123@ORADB> insert into t select * from (select * from t order by dbms_random.value) where rownum<10;

9 rows created.

Elapsed: 00:00:00.17

 

dingjun123@ORADB> insert into t select * from (select * from t order by dbms_random.value) where rownum<3;

2 rows created.

Elapsed: 00:00:00.11

 

dingjun123@ORADB> /

2 rows created.

 

 

Elapsed: 00:00:00.12

dingjun123@ORADB> /

2 rows created.

Elapsed: 00:00:00.11

 

dingjun123@ORADB> /

2 rows created.

Elapsed: 00:00:00.11

 

dingjun123@ORADB> /

2 rows created.

Elapsed: 00:00:00.12

 

dingjun123@ORADB> /

2 rows created.

Elapsed: 00:00:00.11

 

dingjun123@ORADB> commit;

Commit complete.

 

dingjun123@ORADB> insert into t select owner,object_name,subobject_name,(select max(object_id) from t)+rownum,data_object_id,object_type,created,LAST_DDL_TIME,TIMESTAMP,STATUS,

  2  TEMPORARY,GENERATED,SECONDARY,NAMESPACE,EDITION_NAME from t;

75313 rows created.

Elapsed: 00:00:00.15

 

dingjun123@ORADB> /

150626 rows created.

Elapsed: 00:00:00.27

 

dingjun123@ORADB> /

301252 rows created.

Elapsed: 00:00:00.59

 

dingjun123@ORADB> /

602504 rows created.

Elapsed: 00:00:03.50

 

dingjun123@ORADB> /

1205008 rows created.

Elapsed: 00:00:09.65

 

dingjun123@ORADB> commit;

Commit complete.

Elapsed: 00:00:00.00

 

 

dingjun123@ORADB>  insert into t select owner,object_name,subobject_name,(select max(object_id) from t)+rownum,data_object_id,object_type,created,LAST_DDL_TIME,TIMESTAMP,STATUS,

  2      TEMPORARY,GENERATED,SECONDARY,NAMESPACE,EDITION_NAME from t;

2410016 rows created.

Elapsed: 00:00:14.41

 

dingjun123@ORADB> /

4820032 rows created.

Elapsed: 00:00:41.13

dingjun123@ORADB> commit;

Commit complete.

Elapsed: 00:00:00.00

 

--2.关键,建立exceptions表,然后建立唯一约束,有重复的rowid信息自动放入exceptions表里,也就是42条重复记录的row_id会放到exceptions 表里

dingjun123@ORADB> create table exceptions(row_id rowid,

  2                             owner varchar2(30),

  3                              table_name varchar2(30),

  4                              constraint varchar2(30));

 

 

Table created.

Elapsed: 00:00:00.01

 

 

--可以加nologging,parallel提高效率,查找重复记录非常快

dingjun123@ORADB> alter table t add constraint uk_t unique(object_id,object_name,owner) 

  2  exceptions into EXCEPTIONS NOLOGGING PARALLEL 4 ;

alter table t add constraint uk_t unique(object_id,object_name,owner)

                             *

ERROR at line 1:

ORA-02299: cannot validate (DINGJUN123.UK_T) - duplicate keys found

Elapsed: 00:00:53.53

 

dingjun123@ORADB> select count(*) from t;

  COUNT(*)

----------

   9640064

 

1 row selected.

Elapsed: 00:00:01.56

 

--获得重复记录

dingjun123@ORADB> select count(*) from exceptions;

  COUNT(*)

----------

        42

1 row selected.

Elapsed: 00:00:00.01

 

--3.插入重复记录到临时表dups中

dingjun123@ORADB>    create table dups

  2      as

  3      select *

  4        FROM t

  5       where rowid in ( select row_id from exceptions );

Table created.

Elapsed: 00:00:00.07

 

--4.删除所有重复记录

dingjun123@ORADB> delete from t where rowid in ( select row_id from 

  2  exceptions );

42 rows deleted.

Elapsed: 00:00:00.02

 

--5.重复记录保留一份

dingjun123@ORADB> insert into t 

SELECT owner,object_name,subobject_name,(select max(object_id) from t)+rownum,data_object_id,object_type,created,LAST_DDL_TIME,TIMESTAMP,STATUS,

    TEMPORARY,GENERATED,SECONDARY,NAMESPACE,EDITION_NAME

FROM (

select owner,object_name,subobject_name,object_id,data_object_id,object_type,created,LAST_DDL_TIME,TIMESTAMP,STATUS,

    TEMPORARY,GENERATED,SECONDARY,NAMESPACE,EDITION_NAME,

    row_number() OVER(PARTITION BY object_id,object_name,owner ORDER BY ROWID) rn

     from dups

   )WHERE rn=1;

 

21 rows created.

Elapsed: 00:00:00.01

dingjun123@ORADB> commit;

Commit complete.

Elapsed: 00:00:00.01

分享到:
评论

相关推荐

    去除重复数据,去除重复数据算法

    根据给定文件的信息,本文将围绕“去除重复数据”这一主题进行深入探讨,重点解析一个简单易懂且适用性广的去重算法,并通过具体的代码示例来展示其实现过程。 ### 去除重复数据的基本概念 在计算机科学中,“去除...

    ORACLE删除重复数据

    ORACLE 删除重复数据 在 ORACLE 数据库中,删除重复数据是一项常见的操作。重复数据的存在可能会导致数据不一致、查询效率下降等问题。今天,我们将介绍三种删除重复数据的方法,并对每种方法的执行时间进行比较。 ...

    sqlServer删除重复数据

    SQL Server 删除重复数据 SQL Server 删除重复数据是数据库管理中的一项重要任务。重复数据可能是完全重复的记录,也可能是部分关键字段重复的记录。删除重复数据可以使用多种方法,包括使用 SELECT DISTINCT 语句...

    易语言学习进阶去除重复数据源码

    "易语言学习进阶去除重复数据源码"这个标题表明,我们将会探讨如何在易语言中处理数据源,特别是如何去除其中的重复项,这对于数据处理和分析来说是一项基本但重要的技能。 在编程中,数据源通常指的是存储数据的...

    oracle中如何删除重复数据

    在Oracle数据库中,删除重复数据是一项常见的数据清洗任务,尤其当表设计不当时,重复数据可能导致数据不一致和分析错误。以下将详细解释如何在Oracle中处理这两种类型的重复数据问题:部分字段重复和完全重复记录。...

    数据库 查询删除重复数据

    "数据库查询删除重复数据" 数据库查询删除重复数据是数据库管理中的一项重要操作,旨在查找和删除表中的重复记录。重复记录是根据单个字段或多个字段来判断的。下面介绍几种查找和删除重复记录的方法。 根据单个...

    OracleSQL实例-删除重复数据行留最新日期实例.pdf

    在Oracle SQL中,删除重复数据并保留最新日期的实例是一个常见的数据清理任务,尤其是在具有历史记录或事务数据的数据库中。这个实例展示了如何通过SQL查询有效地处理这种情况。在这个例子中,我们有一个名为`abc`的...

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

    ### Oracle 下删除重复数据的方法及分析 #### 一、部分字段重复数据的处理 ##### 查询重复数据 在Oracle数据库中,经常会遇到表中存在部分字段重复的情况。为了找到这些重复的记录,我们可以使用以下SQL语句: `...

    ORACLE去除重复数据方法

    ### ORACLE去除重复数据方法 在数据库管理与维护过程中,数据重复问题是非常常见的现象,尤其在大型企业级应用中更是如此。重复数据不仅占用存储空间,还可能导致数据分析结果出现偏差,影响业务决策的准确性。因此...

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

    ### Oracle数据库删除重复数据的方法 在Oracle数据库管理中,处理重复数据是一项常见且重要的任务。重复数据不仅会占用额外的存储空间,还可能导致数据分析时出现偏差。因此,掌握如何有效地识别并删除这些重复记录...

    删除Access数据库中重复的数据

    5. **删除重复数据**:在确认了要删除的重复记录后,可以使用Access的“删除查询”功能来移除它们。但请注意,删除操作是不可逆的,因此在执行前务必备份数据。 6. **自动化过程**:如果经常需要进行此操作,可以...

    excel中删除重复数据

    因此,掌握如何在Excel中删除重复数据是一项非常实用且重要的技能。 ### 标题:Excel中删除重复数据 #### 知识点一:手动删除重复数据 1. **选择数据范围**:首先选中包含重复数据的列或整个数据区域。 2. **使用...

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

    oracle 删除重复数据的几种方法 在 Oracle 中,删除重复的数据是一种常见的操作。delete 操作可以用来删除重复的数据,但是需要根据实际情况选择合适的方法。下面将介绍四种删除重复数据的方法,每种方法都有其优...

    数据结构 合并链表 并去除重复数据.

    去除重复数据是指从链表中删除重复的元素,例如,如果链表中有多个相同的元素,只保留一个。去除重复数据可以使用多种算法,例如哈希表算法、排序算法等。在本例中,我们使用了一种简单的算法来去除重复数据。 下面...

    SQL Server删除重复数据的几个方法

    ### SQL Server删除重复数据的方法 在数据库管理过程中,经常会遇到需要清理重复数据的情况。重复数据不仅浪费存储空间,还可能导致数据分析结果出现偏差。对于SQL Server而言,有多种方法可以用来删除重复的数据,...

    如何在Excel2021中快速删除重复数据项.docx

    Excel 2021 删除重复数据项 在 Excel 2021 中,删除重复数据项变得更加方便和快捷。下面是相关知识点的详细解释: 1. 删除重复数据项的重要性 在数据分析和处理过程中,删除重复数据项是一项非常重要的步骤。重复...

    plsql删除重复记录

    ### PL/SQL删除Oracle数据库中的重复记录方法详解 ...通过上述步骤,你可以有效地识别并删除Oracle数据库中的重复记录,从而保持数据的一致性和准确性。这种方法不仅适用于简单的场景,对于复杂的业务环境也同样适用。

    基于MD5算法的重复数据删除技术的研究与改进

    ### 基于MD5算法的重复数据删除技术的研究与改进 #### 一、引言 随着信息技术的迅速发展,企业对于数据的需求日益增长。在信息化时代,数据被视为企业的核心资产,不仅对于日常运营至关重要,同时也是企业进行战略...

    【会计实操经验】Excel如何去除重复数据.pdf

    Excel 中去除重复数据的多种方法 Excel 是一个非常强大和普遍使用的电子表格软件,它提供了许多实用的功能来帮助用户处理和分析数据。其中,去除重复数据是一个非常重要和常用的操作。本文将详细介绍多种在 Excel ...

Global site tag (gtag.js) - Google Analytics