`

oracle删除重复的行

    博客分类:
  • DBA
阅读更多

需求:当多行tid重复时,保留tid小的的行,其他重复的行删除。

原书数据:
select t.*,t.rowid from test12 t;
TID        TNAME        TTIME        SSEX        ROWID
11        12                                      AAAMP+AAEAAAAC0AAA
111        1a2                                     AAAMP+AAEAAAAC0AAB
21        2121                    2012-11-13 15:30:45                AAAMP+AAEAAAAC0AAC
21        2121                    2012-11-13 15:41:18        男        AAAMP+AAEAAAAC0AAD
23        2121                    2012-11-13 15:41:31        女        AAAMP+AAEAAAAC0AAE
23        2121                    2012-11-13 15:41:48        nv        AAAMP+AAEAAAAC0AAF

实现:通过rowid
select s.tid,min(s.rowid) from test12 s,test12 t where t.tid=s.tid group by s.tid;

11        AAAMP+AAEAAAAC0AAA
21        AAAMP+AAEAAAAC0AAC
23        AAAMP+AAEAAAAC0AAE
111        AAAMP+AAEAAAAC0AAB

select s.tid,s.rowid from test12 s,test12 t where s.rowid>t.rowid and t.tid=s.tid;
21        AAAMP+AAEAAAAC0AAD
23        AAAMP+AAEAAAAC0AAF

select s.tid,s.rowid from test12 s,test12 t where s.rowid<t.rowid and t.tid=s.tid;
21        AAAMP+AAEAAAAC0AAC
23        AAAMP+AAEAAAAC0AAE

删除方法一:成功!
delete test12 t where t.rowid not in (select min(s.rowid) from test12 s where t.tid=s.tid group by s.tid);----如果是保留最大的唯一行,换max即可。
TID        TNAME        TTIME        SSEX        ROWID
11        12                                      AAAMP+AAEAAAAC0AAA
111        1a2                                     AAAMP+AAEAAAAC0AAB
21        2121                    2012-11-13 15:30:45                AAAMP+AAEAAAAC0AAC
23        2121                    2012-11-13 15:41:31        女        AAAMP+AAEAAAAC0AAE

删除方法二:失败!
delete test12 t where t.rowid in (select s.rowid from test12 s where s.tid=t.tid and s.rowid>t.rowid);

解:
由于这个例子的特殊性,所以select s.tid,s.rowid from test12 s,test12 t where s.rowid>t.rowid and t.tid=s.tid;

select s.tid,s.rowid from test12 s,test12 t where s.rowid<t.rowid and t.tid=s.tid;可以查询出来正确的结果。

测试:
insert into test12 values(23,'fsf',sysdate,'F');
insert into test12 values(23,'fsf',sysdate,'M');

select t.*,t.rowid from test12 t;
TID        TNAME        TTIME        SSEX        ROWID
11        12                                      AAAMP+AAEAAAAC0AAA
111        1a2                                     AAAMP+AAEAAAAC0AAB
21        2121                    2012-11-13 15:30:45                AAAMP+AAEAAAAC0AAC
21        2121                    2012-11-13 15:41:18        男        AAAMP+AAEAAAAC0AAD
23        2121                    2012-11-13 15:41:31        女        AAAMP+AAEAAAAC0AAE
23        2121                    2012-11-13 15:41:48        nv        AAAMP+AAEAAAAC0AAF
23        fsf                     2012-11-14 10:09:14        F         AAAMP+AAEAAAAC2AAA
23        fsf                     2012-11-14 10:11:50        M         AAAMP+AAEAAAAC2AAB

错误结果一:
select s.tid,s.rowid from test12 s,test12 t where s.rowid>t.rowid and t.tid=s.tid;
21        AAAMP+AAEAAAAC0AAD
23        AAAMP+AAEAAAAC2AAB
23        AAAMP+AAEAAAAC2AAA
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC2AAB
23        AAAMP+AAEAAAAC2AAA
23        AAAMP+AAEAAAAC2AAB

错误结果二:
select s.tid,s.rowid from test12 s,test12 t where s.rowid<t.rowid and t.tid=s.tid;
21        AAAMP+AAEAAAAC0AAC
23        AAAMP+AAEAAAAC0AAE
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC0AAE
23        AAAMP+AAEAAAAC2AAA
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC0AAE

由于是比较,两个表,以笛卡尔积的方式,进行对比,取小的rowid(错误二的例子),首选s表的第一行(tid为23第一行)AAAMP+AAEAAAAC0AAE
与t表的第一比较,相等,无结果;与第二行,第三行,第四行(tid为23的四行),均最小,则,有三条结果;然后s表的第二行开始比较,比t表的第一行大,与第二行相等,比第三、四行相等,则有两条结果;然后s表的第三行,再去比较,比t表的第一、二行都大,与第三行相等,比第四行小,所以一条结果;s表第四行比t表第一、二、三行都大,与第四行相等,所以无结果。综上所述,最终结果(无序的)为:
21        AAAMP+AAEAAAAC0AAC
23        AAAMP+AAEAAAAC0AAE
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC0AAE
23        AAAMP+AAEAAAAC2AAA
23        AAAMP+AAEAAAAC0AAF
23        AAAMP+AAEAAAAC0AAE



补充:如果要指定删除重复(tid)行为4(N)行以上的,保留最小的行,其他的删除。
则在where后增加rowid not in (select min(rowid) from test12 group by tid having count(*) >4) and tid in (select tid from test12 group by tid having count(*) >4);这种方法更加灵活,可以实现的功能更多。

分享到:
评论

相关推荐

    解决Oracle删除重复数据只留一条的方法详解

    查询及删除重复记录的SQL语句1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 group by Id having count(Id) &gt; 1)2、删除表中多余的重复记录,...

    oracle删除重复记录性能分析

    ### Oracle删除重复记录性能分析 #### 一、背景与需求 在数据库管理中,经常会遇到数据清理的需求,尤其是在Oracle数据库中处理重复记录时。本文旨在通过对比几种不同的方法来删除Oracle中的重复记录,并分析其...

    ORACLE删除重复数据

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

    Oracle删除表中的重复数据

    ### Oracle删除表中的重复数据方法 在Oracle中删除表中的重复数据,可以采用多种策略,但通常涉及创建一个临时表来保存去重后的数据,然后用这个临时表覆盖原始表。这种方法可以避免直接修改原表带来的风险,确保...

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

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

    oracle中如何删除重复的记录

    这种方法适用于只需要删除重复记录中的某些行的情况。步骤如下: 1. **找出重复的记录**:首先,我们需要找到那些重复的记录。可以通过子查询来实现这一点。 ```sql SELECT age FROM ( SELECT age, COUNT(*) as...

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

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

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

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

    Oracle查询重复数据并删除,只保留一条记录.docx

    Oracle 查询重复数据并删除,只保留一条记录 Oracle 是一种关系型数据库管理系统,广泛应用于企业级数据库管理。然而,在实际应用中,数据重复问题经常会出现,例如在资源目录在线编目的资源项子表中存在多条重发...

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

    根据给定的文件标题、描述和部分内容,我们可以深入探讨Oracle数据库中删除重复记录的方法,这对于维护数据完整性和提高系统性能至关重要。以下将详细介绍几种在Oracle数据库中有效删除重复记录的技术。 ### 1. ...

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

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

    oracle删除重复记录

    本文介绍了在Oracle数据库中如何有效识别和删除重复记录的方法。通过对表中的数据进行适当的清理,不仅可以提高数据质量,还能节省存储资源。希望本文能帮助您更好地管理和维护Oracle数据库中的数据。

    oracle 删除去掉重复项

    在Oracle数据库管理中,处理数据冗余和删除重复项是一项重要的任务,这有助于维护数据的完整性和提升查询效率。本文将深入探讨Oracle中删除和处理重复数据的方法,特别是基于提供的内容,我们将详细解析如何通过SQL...

    oracle中如何删除重复数据

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

    plsql删除重复记录

    **ROWID**:在Oracle数据库中,每个表行都有一个唯一的ROWID,它是表行的物理地址。通过比较ROWID,我们可以轻易地找出那些具有相同字段值但不同ROWID的记录,即重复记录。 删除重复记录的SQL语句如下: ```sql ...

    oracle删除重复数据的sql语句

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

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

    - **解释**:此查询将返回所有重复行的关键字段组合及其重复次数。 2. **使用ROWID** - **原理**:ROWID是Oracle中用于唯一标识每条记录的一个特殊属性,利用ROWID可以快速定位到具体记录。 - **示例代码**: `...

    oracle删除重复数据方法

    Oracle 数据库中删除重复数据的方法是一项常见的数据清洗任务,尤其在大数据量的环境中,确保数据的唯一性和准确性至关重要。以下是一些针对不同情况的 Oracle SQL 语句,用于查找和删除重复数据: 1. **根据单个...

Global site tag (gtag.js) - Google Analytics