Welcome 微信登录

首页 / 数据库 / MySQL / 浅谈如何查找Oracle数据库中的重复记录

本文介绍了几种快速查找Oracle数据库中的重复记录的方法。作为一个Oracle数据库开发者,经常需要对一些表的一列或几列来创建索引,为行提供直接的快速存取。但在创建时,经常会遇到这样的提示:ORA-01452:不能创建惟一索引,发现重复记录。Oracle系统提示不能对表创建一个惟一索引,是因为系统发现表中存在重复的记录。只有先找到表中的重复记录并删除该记录,才可以创建惟一索引。下面以表table_name为例,介绍三种不同的方法来确定库表中重复的记录。[b]1.[/b][b]利用分组函数查找表中的重复行[/b][b]
[/b] 利用select 语句中的分组函数GROUP BY/HAVING可以很容易确定重复的行。假设需要创建惟一索引的列为column,对column用group by分组统计并返回每组的个数,如果组中记录数超过1个就存在重复的行。命令如下:
SQL>Select column from table_name
Group by column
Having count(column)>1;
这种查询方式简便、快捷,是ORACLE数据库中最常用的一种方法。
[b]2.[/b][b]利用伪列自关联查询[/b][b] [/b][b]
[/b] 在ORACLE数据库的内部,每一表都有一rowid伪列,行标识惟一标识行,提供对特殊行的快速存取。对该列使用最大(max)或者最小(min)函数可以非常容易地确定重复的行。
1)利用max函数查找重复行
SQL>select column1, column2, column3 from table_name a
          where rowid
2).利用min函数查找重复行
SQL>select column1,column2,column3 from table_name a
              where rowid> (select min(rowid) from table_name
              where column1=a.column1 and column2=a.column2
              and colum3=a.colum3 and ...);
不过,当表比较大(例如50万条以上)时,这个方法的效率之差令人无法忍受。
    [b]3.[/b][b]通过定义完整性约束查找重复行[/b]
    定义一个完整性约束,integrity constraint是一个限制基表中一列或多列值的规则。可通过对表定义UNIQUE约束,指定惟一关键字。为了满足此约束,在惟一关键字列中不能包含相同的值。因此可用EXCEPTIONS INTO子句,将违背激活的完整性约束的记录存储在一个表(EXCEPTIONS)中,此表必须在使用此选项之前先建好。将EXCEPTIONS表和table_name表通过rowid关联起来即可得到表table_name中重复的记录。 具体方法如下:
     1)创建表EXCEPTIONS,用来存放重复记录的信息。
         SQL>create table exceptions(row_id rowid,
                                   owner varchar2(30),
                                   table_name varchar2(30),
                                   constraint varchar2(30));
2)为表table_name定义惟一(UNIQUE)约束,如果在定义的关键字中包含相同的值,系统将提示ORA-02299: 不能创建 - 有重复的值,并将重复记录的信息存入EXCEPTIONS表中。
SQL>alter table table_name
                add constraint unq_column
                unique(column1,column2,……)
              exceptions into EXCEPTIONS;
2. 将表table_name与EXCEPTIONS通过伪列(rowid)建立关联,伪列相等的记录就是table_name中的重复记录。
SQL>select column1,column2,……
from table_name a ,EXCEPTIONS b
              where a.rowid=b.row_id ;这种方式查询效率较高,而且可以较完全的记录下重复记录的信息,但是步骤较繁琐。RHEL5.5安装Oracle 11 gr2(单机版)Oracle SQL 中的IN & EXISTS 比较相关资讯      oracle 
  • [INS-32052] Oracle基目录和Oracle  (07/22/2014 07:41:41)
  • Oracle 4个大对象(lobs)数据类型  (02/03/2013 12:33:05)
  • Oracle按时间段分组统计  (07/26/2012 10:36:48)
  • [Oracle] dbms_metadata.get_ddl的  (07/12/2013 07:37:30)
  • Liferay Portal 配置使用Oracle和  (07/31/2012 20:07:18)
  • Concurrent Request:Inactive   (07/20/2012 07:44:05)
本文评论 查看全部评论 (0)
表情: 姓名: 字数