Oracle SQL中查找和删除重复记录方法

Oracle中查找和删除重复记录方法 
Oracle SQL中查找和删除重复记录方法平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA
- 01452  :不能创建唯一索引,发现重复记录。
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法下面总结一下几种查找和删除重复记录的方法(以表CZ为例):
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法表CZ的结构如下:
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
>   desc  cz
Oracle SQL中查找和删除重复记录方法Name 
Null ? Type
Oracle SQL中查找和删除重复记录方法
-- --------------------------------------- 
Oracle SQL中查找和删除重复记录方法

Oracle SQL中查找和删除重复记录方法C1 
NUMBER ( 10 )
Oracle SQL中查找和删除重复记录方法C10 
NUMBER ( 5 )
Oracle SQL中查找和删除重复记录方法C20 
VARCHAR2 ( 3 )
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法删除重复记录的方法原理:
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法(
1 ).在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法(
2 ).在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法重复记录判断的标准是:
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法C1,C10和C20这三列的值都相同才算是重复记录。
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法经查看表CZ总共有16条记录:
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> set  pagesize  100
Oracle SQL中查找和删除重复记录方法SQL
> select   *   from  cz;
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法C1 C10 C20
Oracle SQL中查找和删除重复记录方法
-- -------- ---------- ---
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
4   5  err
Oracle SQL中查找和删除重复记录方法
5   3  dar
Oracle SQL中查找和删除重复记录方法
6   1  wee
Oracle SQL中查找和删除重复记录方法
7   2  zxc
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
20  rows selected.
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
1 .查找重复记录的几种方法:
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法(
1 ).SQL > select   *   from  cz  group   by  c1,c10,c20  having   count ( * > 1 ;
Oracle SQL中查找和删除重复记录方法C1 C10 C20
Oracle SQL中查找和删除重复记录方法
-- -------- ---------- ---
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法(
2 ).SQL > select   distinct   *   from  cz;
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法C1 C10 C20
Oracle SQL中查找和删除重复记录方法
-- -------- ---------- ---
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法(
3 ).SQL > select   *   from  cz a  where  rowid = ( select   max (rowid) 
Oracle SQL中查找和删除重复记录方法
from  cz  where  c1 = a.c1  and  c10 = a.c10  and  c20 = a.c20);
Oracle SQL中查找和删除重复记录方法C1 C10 C20
Oracle SQL中查找和删除重复记录方法
-- -------- ---------- ---
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
2 .删除重复记录的几种方法:
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法(
1 ).适用于有大量重复记录的情况(在C1,C10和C20列上建有索引的时候,用以下语句效率会很高):
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> delete  cz  where  (c1,c10,c20)  in  ( select  c1,c10,
Oracle SQL中查找和删除重复记录方法c20 
from  cz  group   by  c1,c10,c20  having   count ( * ) > 1 and  rowid  not   in
Oracle SQL中查找和删除重复记录方法(
select   min (rowid)  from  cz  group   by  c1,c10,c20  having   count ( * ) > 1 );
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> delete  cz  where  rowid  not   in
Oracle SQL中查找和删除重复记录方法(
select   min (rowid)  from  cz  group   by  c1,c10,c20);
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法(
2 ).适用于有少量重复记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> delete   from  cz a  where  a.rowid != ( select   max (rowid)
Oracle SQL中查找和删除重复记录方法
from  cz b  where  a.c1 = b.c1  and  a.c10 = b.c10  and  a.c20 = b.c20);
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> delete   from  cz a  where  a.rowid < ( select   max (rowid) 
Oracle SQL中查找和删除重复记录方法
from  cz b  where  a.c1 = b.c1  and  a.c10 = b.c10  and  a.c20 = b.c20);
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> delete   from  cz a  where  rowid  < ( select   max (rowid) 
Oracle SQL中查找和删除重复记录方法
from  cz  where  c1 = a.c1  and  c10 = a.c10  and  c20 = a.c20);
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法(
3 ).适用于有少量重复记录的情况(临时表法):
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> create   table  test  as   select   distinct   *   from  cz; 
Oracle SQL中查找和删除重复记录方法(建一个临时表test用来存放重复的记录)
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> truncate   table  cz; (清空cz表的数据,但保留cz表的结构)
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> insert   into  cz  select   *   from  test; 
Oracle SQL中查找和删除重复记录方法(再将临时表test里的内容反插回来)
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法(
4 ).适用于有大量重复记录的情况(Exception  into  子句法):
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法采用alter 
table  命令中的 Exception  into  子句也可以确定出库表中重复的记录。这种方法稍微麻烦一些,为了使用“excepeion  into  ”子句,必须首先创建 EXCEPTIONS 表。创建该表的 SQL 脚本文件为 utlexcpt.sql 。对于win2000系统和 UNIX 系统, Oracle 存放该文件的位置稍有不同,在win2000系统下,该脚本文件存放在$ORACLE_HOMEOra90rdbmsadmin 目录下;而对于 UNIX 系统,该脚本文件存放在$ORACLE_HOME / rdbms / admin 目录下。
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法具体步骤如下:
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> @? / rdbms / admin / utlexcpt.sql
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
Table  created.
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> desc  exceptions
Oracle SQL中查找和删除重复记录方法Name 
Null ? Type
Oracle SQL中查找和删除重复记录方法
-- --------------------------------------- 
Oracle SQL中查找和删除重复记录方法

Oracle SQL中查找和删除重复记录方法ROW_ID ROWID
Oracle SQL中查找和删除重复记录方法OWNER 
VARCHAR2 ( 30 )
Oracle SQL中查找和删除重复记录方法TABLE_NAME 
VARCHAR2 ( 30 )
Oracle SQL中查找和删除重复记录方法
CONSTRAINT   VARCHAR2 ( 30 )
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> alter   table  cz  add   constraint  
Oracle SQL中查找和删除重复记录方法cz_unique 
unique (c1,c10,c20) exceptions  into  exceptions; 
Oracle SQL中查找和删除重复记录方法
*
Oracle SQL中查找和删除重复记录方法ERROR at line 
1 :
Oracle SQL中查找和删除重复记录方法ORA
- 02299 : cannot validate (TEST.CZ_UNIQUE)  -  duplicate keys found
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> create   table  dups  as   select  
Oracle SQL中查找和删除重复记录方法
*   from  cz  where  rowid  in  ( select  row_id  from  exceptions); 
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
Table  created.
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> select   *   from  dups; 
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法C1 C10 C20
Oracle SQL中查找和删除重复记录方法
-- -------- ---------- ---
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
16  rows selected.
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> select  row_id  from  exceptions;
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法ROW_ID
Oracle SQL中查找和删除重复记录方法
-- ----------------
Oracle SQL中查找和删除重复记录方法
AAAHD / AAIAAAADSAAA
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAB
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAC
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAF
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAH
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAI
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAG
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAD
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAE
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAJ
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAK
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAL
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAM
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAN
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAO
Oracle SQL中查找和删除重复记录方法AAAHD
/ AAIAAAADSAAP
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
16  rows selected.
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> delete   from  cz  where  rowid  in  
Oracle SQL中查找和删除重复记录方法
select  row_id  from  exceptions);
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
16  rows deleted.
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> insert   into  cz  select   distinct   *   from  dups;
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
3  rows created.
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法SQL
> select   * from  cz;
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法C1 C10 C20
Oracle SQL中查找和删除重复记录方法
-- -------- ---------- ---
Oracle SQL中查找和删除重复记录方法
1   2  dsf
Oracle SQL中查找和删除重复记录方法
2   3  che
Oracle SQL中查找和删除重复记录方法
3   4  dff
Oracle SQL中查找和删除重复记录方法
4   5  err
Oracle SQL中查找和删除重复记录方法
5   3  dar
Oracle SQL中查找和删除重复记录方法
6   1  wee
Oracle SQL中查找和删除重复记录方法
7   2  zxc
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法
7  rows selected.
Oracle SQL中查找和删除重复记录方法
Oracle SQL中查找和删除重复记录方法从结果里可以看到重复记录已经删除。

你可能感兴趣的:(Oracle SQL)