您当前位置:主页 > 资讯攻略 >
来源:未知
2020-04-13 20:17:06 浏览: 分类:资讯攻略

oracle 查找、删除重复记录

总结了删除重复记录的方法,以及每种方法的优缺点。

假设表名为Tbl,表中有三列col1、col2和col3,其中col1和col2为主键,col1和col2添加了索引。

1.通过创建临时表

您可以先将数据导入到临时表中,然后删除原始表的数据,再将数据导入回原始表中。SQL语句如下所示:

创建表tbl_tmp(从tbl中选择distinct *);

截断表tbl//清除空表记录

插入到tbl select * from tbl _ tmp//将临时表中的数据插回。

这种方法可以满足要求,但是显然,对于一个有几千万条记录的表来说,这种方法是非常慢的。在生产系统中,会给系统带来很大的开销,不可行。

2.使用rowid

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

delete from TBL where rowid in(select a . rowid from TBL a,tbl b where a.rowid & gtb.rowid和a.col1=b.col1和a.col2 = b.col2)

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

3.使用最大或最小函数

这里也使用了Rowid,与上面的不同之处在于它是通过组合max或min函数来实现的。SQL语句如下所示

从tbl a中删除其中rowid不在(从tbl b中选择max(b.rowid)其中a.col1=b.col1,a . col 2 = b . col 2);//max在这里也可以用min

或者使用下面的语句

从tbl a中删除where rowid & lt(select max(b.rowid) from tbl b其中a.col1=b.col1,a.col2 = b.col2

4.使用group by来提高效率。

平时尝试为库表中的一列或几列创建唯一索引时,系统提示ORA-01452:不能创建唯一索引,发现重复记录。

以下是查找和删除重复记录的一些方法(以表CZ为例):

表CZ的结构如下:

SQL & gtdesc cz

名字空?类型

- - -

C1数(10)

C10号(5)

C20 VARCHAR2(3)

删除重复记录的原则:

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

(2).在重复记录中,所有列的内容可能是相同的,但rowid不会相同,所以只需确定重复记录中rowid最大的那些,删除所有其他的。

记录重复判断的标准是:

只有当C1、C10和C20三列的值相同时,才能视为重复记录。

表CZ中有16条记录:

SQL & gt设置页面大小为100

SQL & gtselect * from cz

C1 C10 C20

- - -

1 2 dsf

1 2 dsf

1 2 dsf

1 2 dsf

2辆3辆

1 2 dsf

1 2 dsf

1 2 dsf

1 2 dsf

2辆3辆

2辆3辆

2辆3辆

2辆3辆

3 4 dff

3 4 dff

3 4 dff

4 5错误

5月3日

6 1周

7 2 zxc

选择了20行。

本文链接:http://www.123down.cn/gonglue/227138.html

攻略资讯
安卓软件