SELECT * FROM emp a
WHERE rowid ANY
(SELECT rowid FROM emp b
WHERE a.ename = b.ename
)
可以找到冗余的数据
今个发现还有一个比较简便的方法,如下使用 exceptions into exceptions;
SQL create table t ( a int, b int, c int );
表已创建。
SQL insert into t select rownum,rownum+1,rownum+2 from all_objects where rownum
<5;
已创建4行。
SQL insert into t select *from t where rownum<3;
已创建2行。
SQL commit;
提交完成。
SQL select *from t;
A
B
C
---------- ---------- ----------
1
2
3
2
3
4
3
4
5
4
5
6
1
2
3
2
3
4
已选择6行。
SQL create table exceptions(row_id rowid,
2
owner varchar2(30),
3
table_name varchar2(30),
4
constraint varchar2(30));
表已创建。
SQL
SQL alter table t add constraint t_unique
2
unique(a,b,c) exceptions into exceptions;
alter table t add constraint t_unique
*
ERROR 位于第 1 行:
ORA-02299: 无法验证 (EPUSER.T_UNIQUE) - 未找到重复关键字
SQL create table dups
2
as select *from t where rowid in (select row_id from exceptions);
表已创建。
SQL select *from dups;
A
B
C
---------- ---------- ----------
1
2
3
2
3
4
1
2
3
2
3
4
SQL select row_id from exceptions;
ROW_ID
------------------
AAAIEJAAKAAAyMSAAA
AAAIEJAAKAAAyMSAAE
AAAIEJAAKAAAyMSAAB
AAAIEJAAKAAAyMSAAF
SQL delete from t where rowid in ( select row_id
2
from exceptions );
已删除4行。
SQL insert into t select distinct * from dups;
已创建2行。
SQL
SQL commit;
提交完成。
SQL select *from t;
A
B
C
---------- ---------- ----------
3
4
5
4
5
6
1
2
3
2
3
4