易截截图软件、单文件、免安装、纯绿色、仅160KB

Oracle中用Rowid查找和删除重复记录

Oracle中用Rowid查找和删除重复记录
  平时工作中可能会碰到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。
  下面总结一下几种查找和删除重复记录的方法(以表CZ为例):
  表CZ的结构如下:
  SQL> desc cz
  Name Null? Type
  ----------------------------------------- -------- ------------------
  C1 NUMBER(10)
  C10 NUMBER(5)
  C20 VARCHAR2(3)
  删除重复记录的方法原理:
  (1).在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。
  (2).在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。
  重复记录判定的标准是:
  C1,C10和C20这三列的值都相同才算是重复记录。
  经查看表CZ总共有16条记录:
  SQL>set pagesize 100
  SQL>select * from cz;
  C1 C10 C20
  ---------- ---------- ---
  1 2 dsf
  1 2 dsf
  1 2 dsf
  1 2 dsf
  2 3 che
  1 2 dsf
  1 2 dsf
  1 2 dsf
  1 2 dsf
  2 3 che
  2 3 che
  2 3 che
  2 3 che
  3 4 dff
  3 4 dff
  3 4 dff
  4 5 err
  5 3 dar
  6 1 wee
  7 2 zxc
  20 rows selected.
  1.查找重复记录的几种方法:
  (1).SQL>select * from cz group by c1,c10,c20 having count(*) >1;
  C1 C10 C20
  ---------- ---------- ---
  1 2 dsf
  2 3 che
  3 4 dff
  (2).SQL>select distinct * from cz;
  C1 C10 C20
  ---------- ---------- ---
  1 2 dsf
  2 3 che
  3 4 dff
  (3).SQL>select * from cz a where rowid=(select max(rowid) from cz where c1=a.c1 and c10=a.c10 and c20=a.c20);
  C1 C10 C20
  ---------- ---------- ---
  1 2 dsf
  2 3 che
  3 4 dff
  2.删除重复记录的几种方法:
  (1).适用于有大量重复记录的情况(在C1,C10和C20列上建有索引的时候,用以下语句效率会很高):
  SQL>delete cz where (c1,c10,c20) in (select c1,c10,c20 from cz group by c1,c10,c20 having count(*)>1) and rowid not in


相关文档:

Oracle 服务进程 简单介绍

Oracle 服务进程-简单介绍
以Orcale10g的版本为例,简单介绍下Oracle的服务进程(Windows版本) -ganlan。
 
1、OracleCSService
  进程:ocssd.exe
介绍:Cluster Synchronization Services (CSS)—Manages the cluster configuration by controlling which nodes are members of the cluster an ......

oracle distinct用法

distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。
下面先来看看例子:
table表
字段1     字段2
&nbs ......

java jdbc 调用 oracle存储过程 返回游标

1.创建测试表
create table users(
userid int primary key,
username varchar2(20),
userpwd  varchar2(20)
);
insert into users values(1,'test','test');
insert into users values(2,'test','test');
insert into users values(3,'test','test');
insert into users values(4,'test','test');
insert i ......

ORACLE函数大全

  SQL中的单记录函数
1.ASCII
返回与指定的字符对应的十进制数;
SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
        A         A      ZERO   ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号