Code前端首页关于Code前端联系我们

Oracle 如何删除表中的重复记录

terry 2年前 (2023-09-26) 阅读数 45 #数据库

1 简介

在数据库操作过程中可能会出现这种情况。表中的数据可能会重复出现,导致数据库操作时出现读取问题。带来很多不便,那么如何删除这些重复无用的数据呢?

在日常工作中你可能会遇到当你尝试为数据库表中的某一列或多列创建唯一索引时,系统询问ORA-01452:无法创建唯一索引索引,发现重复记录。

2 处理流程

重复数据可以有两种情况:第一种是表中只有部分字段相同,第二种是两行记录完全相同。去除重复记录后的结果也分为两种。第一种是删除所有重复记录,第二种是只保留重复记录之间的最后一条记录。第二种在一般情况下更为常见。

重复记录去除方法原理

(1)在Oracle中,每条记录都有一个rowid,在整个数据库中是唯一的。 rowid 确定 Oracle 中的每条记录位于文件、块、行中的哪些数据。

(2)在重复记录中,所有列的内容可能相同,但rowids不会相同,因此只需找出重复记录中rowid最大的那些,然后删除其余的即可。

删除某些字段中的重复数据

2。删除所有重复记录

如果您想删除某些字段中的重复数据,可以使用以下指令进行删除。以下语句删除表中重复的字段 1 和 2。数据:

DELETE FROM 表名 a

WHERE(字段 1 字段 2)

IN )选择字段 1,字段 2名表 表

按方格 1

方格 2

进行分组,含计数 (1) 11 )

;

上面的语句很简单:删除请求的数据。然而,这种类型的删除执行效率非常低。大量数据可能会导致数据库崩溃。因此,建议先将请求的重复数据插入到临时表中,然后再删除。这样你删除的时候就不用再询问了。如下:

CREATE TABLE临时表AS(选择字段1,字段2,count

组表中的(*)方格 1 上的名称 方格 2 上有计数(*) > 1);

上面这句话是为了解释一个创建一个临时文件表并将请求的数据放入其中。您可以执行如下删除操作:

从表名a中删除字段1字段2 in 从临时表中选择字段1,字段2) );

这种先建临时表再删除的操作,比直接一条语句删除效率高很多。

示例:

从 tmp_lhr 中删除 t

TRUE (t.accesscode, t .lastserviceordercode, t.serviceinstancecode) IN

(SELECT a.accesscode, ,                         tmp_lhr a                                                                                           组                                                                                                                                              ?.2 保存最后一条记录

如果您想要保留重复数据最后一条记录!怎么办?Oracle中有一个隐藏的自动记录,它使每条记录都是唯一的记录。如果我们想保留最后一条记录,可以使用该字段来保留最大的记录包含在重复数据中。

1。如何查找重复记录?

SELECT *

FROM TABLE_NAME A

哪里 ROWID

不在 (选择 MAX(ROWID)

TABLE_NAME D

      TRUE A.COL1 = D.COL1

         AND A.COL2 = D.COL2);

2. 如何删除重复记录?
1。方法1

从TABLE_NAME中删除

WHERE ROWID NOT IN (SELECT MAX(RO WID)1                                FROM TABLE_NAME D

按 d 分组.col1,d.col2);

这个方法最简单了! ! ! ? ROWID不在选择MAX() ROWID)1FROM TABLE_NAME D

                                  Col1

A.Col2 = D.Col2);

3,方法3 临时表

由此我们需要删除重复数据,只保留最新数据。写法如下:

像select a一样创建一个临时表,字段1a。正方形 2,MAX() dataid 来自正式表 a GROUP BY a.Field 1,a.Field 2;

从正式表 a

中删除,其中 a.rowid NOT IN ( 从临时表 b

中选择 b.dataid

,其中 a. 字段 1 = b. 字段 1

和 a. 字段 2 B. 字段 2 ) ;

奉献; (SELECT MAX(ROWID)​​​

哪里!= 来自 hr a

      TRUE  a.访问代码= t.访问码

AND = t.lastserviceordercode

.3 根据特定字段删除记录

----根据需要保留记录

从 ods_entity_info_full_lhr_01 中删除T

T.ROWID 不在 选择 MAXGROUP ONEntity_code,

 ​ ​ entity_id最大记录 |选择 ity_code, t.entity_type, t.entity_id) IN1( 选择实体代码,

MAX (entity_id)

 GROUP BY实体_code,

删除完全重复的记录

对于表如果两行记录完全相同,您可以使用获取去重后的记录有以下三种方法:

  1. selectdistinct * from 表名;
  2. select * from 将表名按列名 1、列名 2、... with count(*)>1
  3. select * from 表名 a where rowid
选择最小值

FROM xr_maintainedsite

使用 row_number 分析函数提取重复记录,然后删除序号大于1的记录

举个例子:

从包含rowid的aa中删除(select get rod of(select get rod of rowid,row_number () about(partition by name, order by id ) 作为 aa 的 seq,其中 seq>1);

3 测试用例

SYS@raclhr1> 创建表 T_ROWS_LHR_20160809 AS SELECT * FROM SCOTT.EMP;

已创建表。

SYS@ raclhr1> 插入T_ROWS_LHR_20160809 SELECT * FROM T_ROWS_LHR_20160809;

已创建 14 行。

SYS@raclhr1> COMMIT;

提交已完成。

SYS@raclhr1> INSERT INTO T_ROWS_LHR_20160809 SELECT * FROM T_ROWS_LHR_20160809;

已创建 28 行。

SYS@raclhr1> COMMIT;

提交已完成。 SYS@raclhr1> 从 T_ROWS_LHR_20160809 中选择计数 (1);

COUNT(1)

----------

    56

SYS@raclhr1> 从 T_ROWS_LHR_20160809 中删除

 2    骑行地点(选择最大(ROWID)

3 _ SYS@raclhr1> 从 T_ROWS_LHR_20160809 选择计数 (1) ;

计数 (1)

----------

14

SYS@raclhr1> 提交;

强制完成。

4经验总结

重复重复数据删除技术可以提供更大的备份容量,实现更长的数据保留时间,还可以实现备份数据的持续验证,提高数据恢复服务水平,方便灾后数据恢复。重复数据删除技术具有以下优势: 更大的备份容量使数据能够得到持续验证,实现更高的数据恢复服务水平,并有利于备份数据的灾难恢复。

通过探索,我想你可以找到更多、更有效的方法来删除重复的Oracle数据。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门