`

在oracle中如何删除表中的重复数据

 
阅读更多

1.利用rowid

oracle中,每一条记录都有一个rowidrowid在整个数据库中是唯一的(rowid确定了每条记录是oracle中的哪一个数据文件、块、行上)。在重复的记录中,可能所有列的内容都相同,但rowid不会相同。SQL语句如下:

DELETE FROM EMPLOYEE

 WHERE ROWID IN (SELECT A.ROWID

                   FROM EMPLOYEE A, EMPLOYEE B

                  WHERE A.ROWID < B.ROWID

                    AND A.NAME = B.NAME);

如果已经知道每条记录只有一条重复的,这个sql语句适用。但是如果每条记录的重复记录有N条,这个N是未知的,就要考虑适用下面这种方法了。

2.结合rowid利用max/min函数

DELETE FROM EMPLOYEE A

 WHERE ROWID NOT IN

       (SELECT MAX(B.ROWID) FROM EMPLOYEE B WHERE A.NAME = B.NAME);

这里也可以使用min或者用下面的语句

DELETE FROM EMPLOYEE A

 WHERE ROWID < (SELECT MAX(B.ROWID) FROM EMPLOYEE B WHERE A.NAME = B.NAME);

这里如果把max换成min的话,前面的where子句中需要把<改为>

3.利用group by

跟上面的方法思路基本是一样的,不过使用group by减少显性的比较条件,提高效率。

DELETE FROM EMPLOYEE

 WHERE ROWID NOT IN (SELECT MAX(ROWID) FROM EMPLOYEE T GROUP BY T.NAME);

或者

DELETE FROM EMPLOYEE

 WHERE NAME IN

       (SELECT NAME FROM EMPLOYEE GROUP BY NAME HAVING COUNT(*) > 1)

   AND ROWID NOT IN

       (SELECT MIN(ROWID) FROM EMPLOYEE GROUP BY NAME HAVING COUNT(*) > 1);

4.利用分析函数

SELECT *

  FROM EMPLOYEE

 WHERE ROWID IN (SELECT RID

                   FROM (SELECT ROWID RID,

                                ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY ROWID) N

                           FROM EMPLOYEE)

                  WHERE N <> 1);

注:如果重复的是多个字段(利用group by)

DELETE FROM EMPLOYEE

 WHERE (NAME, SEX) IN (SELECT NAME, SEX

                         FROM EMPLOYEE

                        GROUP BY NAME, SEX

                       HAVING COUNT(*) > 1)

   AND ROWID NOT IN (SELECT MIN(ROWID)

                       FROM EMPLOYEE

                      GROUP BY NAME, SEX

                     HAVING COUNT(*) > 1);

随便说一下,以上语句的执行效率是很低的,可以考虑建立临时表,将需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。比如:

CREATE TABLE 临时表 AS

  SELECT A.字段1, A.字段2, MAX(A.ROWID) DATAID

    FROM 正式表 A

   GROUP BY A.字段1, A.字段2;

DELETE FROM 表名 A

 WHERE A.ROWID <> (SELECT B.DATAID

                     FROM 临时表 B

                    WHERE A.字段1 = B.字段1

                      AND A.字段2 = B.字段2);

最后一点,对于完全重复记录的删除可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:

CREATE TABLE 临时表 AS(SELECT DISTINCT * FROM 表名);

TRUNCATE TABLE 正式表;

INSERT INTO 正式表 (SELECT * FROM 临时表);

DROP TABLE 临时表;

分享到:
评论

相关推荐

    Oracle删除表中的重复数据

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

    Oracle数据库删除表中重复记录的方法三则.txt

    在Oracle数据库管理中,经常会遇到需要处理表中的重复数据的情况。重复数据不仅会占用不必要的存储空间,还可能导致数据统计错误或业务逻辑混乱等问题。因此,掌握如何有效地删除Oracle数据库表中的重复记录是一项...

    oracle中如何删除重复数据

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

    ORACLE删除重复数据

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

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

    3. **测试**:在实际环境中删除重复数据前,最好在一个测试环境中先模拟一遍整个流程,以确保不会发生意料之外的问题。 总之,高效删除Oracle数据库中的重复数据不仅可以节省存储空间、提高查询效率,还可以保证...

    oracle中如何删除重复的数据

    若想保留重复数据中最新的一条(即ROWID最大的一条),可使用如下查询: ```sql DELETE FROM 表名 a WHERE a.rowid != ( SELECT MAX(b.rowid) FROM 表名 b WHERE a.字段1 = b.字段1 AND a.字段2 = b.字段2 );...

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

    本文介绍了在Oracle数据库中处理重复数据的几种方法。无论是部分字段重复还是完全重复的记录,都可以通过创建临时表的方式提高删除重复记录的效率。此外,在处理重复数据时,还应考虑到保留最新或最旧记录的需求,...

    oracle 查询重复数据

    在IT行业的数据库管理中,处理重复数据是一项常见且重要的任务,尤其在大型数据库如Oracle中。本文将深入探讨如何在Oracle数据库中查询重复数据,理解SQL语句背后的逻辑,并掌握其实现方法。 ### Oracle查询重复...

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

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

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

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

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

    这种方法可以将重复数据删除,并将剩余数据插入到临时表中。 示例代码: ``` create table test_temp as select * from test_0210 where id in (select max(id) from test_0210 group by name); truncate table ...

    oracle中如何删除重复的记录

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

    oracle查询重复数据方法

    Oracle 查询重复数据方法是数据库管理中非常重要的一个问题, Oracle 数据库提供了多种方法来查询和删除重复数据。下面我们将详细介绍几种常见的方法。 方法一:使用 Having 子句 第一种方法是使用 Having 子句来...

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

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

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

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

    删除数据表中重复记录

    本文将详细介绍如何在不同的数据库系统(如MySQL、SQL Server、Oracle等)中删除重复记录。 #### SQL删除重复记录的基本思路 删除重复记录的核心思想是先识别出哪些记录是重复的,然后通过某种方式将这些重复记录...

    oracle删除重复记录性能分析

    例如,在表`tb_mtalk_ggzjlx`中,需要根据`ggzj_zqdm`字段删除除最大ROWID外的所有重复记录。具体SQL语句如下: ```sql DELETE FROM tb_mtalk_ggzjlxa WHERE a.rowid NOT IN ( SELECT MAX(b.rowid) FROM tb_mtalk...

    Oracle中用Rowid查找和删除表中的重复记录

    ### Oracle中用Rowid查找和删除表中的重复记录 在Oracle数据库管理中,处理重复记录是一项常见的需求,尤其是在数据量较大的情况下。本文将详细介绍如何利用Rowid这一特性来有效地查找和删除表中的重复记录。 ####...

    ORACLE去除重复数据方法

    本文介绍了两种在Oracle数据库中去除重复数据的方法:一是通过子查询实现,二是利用窗口函数`ROW_NUMBER()`。这两种方法各有优劣: - **子查询方法**适用于大多数Oracle版本,但可能不够直观,尤其是在处理复杂数据...

Global site tag (gtag.js) - Google Analytics