- 浏览: 894486 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1095)
- 大数据存储 (76)
- 编程语言(Java&Scala) (46)
- 大数据建模 (33)
- 开发与管理 (8)
- 操作系统 (13)
- 实用代码集合 (25)
- 新技术研究 (15)
- 前端技术研究 (22)
- 物联网 (18)
- 兴趣探索 (15)
- 编程语言(Groovy&Grails) (92)
- 编程语言(RubyOnRails) (153)
- 个人收藏 (153)
- 技术管理 (12)
- 编程语言(Flex) (8)
- 架构和框架(GWT) (4)
- 数学和算法 (6)
- 人工智能(TensorFlow) (11)
- 编程语言(Python) (6)
- 移动开发 (4)
- 软件工程实践 (54)
- 个人感悟 (6)
- 职场感悟 (5)
- 行业经验 (23)
- 产品和运营 (10)
- 生活与随想 (155)
- 简单生活 (70)
- 天空的云 (53)
- 秋月春风 (14)
- 东逝水 (59)
- 浪花淘 (35)
- 白发渔樵 (4)
最新评论
-
cljhyjs:
今天看看在研究,已经安装好了,请问怎么一步一步使用呢?
Thingsboard -
yx200404:
说一下十维空间 -
Clear_Love:
设置了也报错
Xcode 7遇到 App Transport Security has blocked a cleartext HTTP 错误 -
wang263574375:
我想问的是,如果防火墙的设置不能改变,那么要怎么处理呢?
ORA-12571:TNS包写入程序失败 -
ralflsb:
SmartSVN 8.6
SmartSVN破解包
平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 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
(select min(rowid) from cz group by c1,c10,c20 having count(*)>1);
sql>delete cz where rowid not in(select min(rowid) from cz group by c1,c10,c20);
(2).适用于有少量重复记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):
sql>delete from cz a where a.rowid!=(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);
sql>delete from cz a where a.rowid<(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);
sql>delete from cz a where rowid <(select max(rowid) from cz where c1=a.c1 and c10=a.c10 and c20=a.c20);
(3).适用于有少量重复记录的情况(临时表法):
sql>create table test as select distinct * from cz; (建一个临时表test用来存放重复的记录)
sql>truncate table cz; (清空cz表的数据,但保留cz表的结构)
sql>insert into cz select * from test; (再将临时表test里的内容反插回来)
(4).适用于有大量重复记录的情况(exception into 子句法):
采用alter table 命令中的 exception into 子句也可以确定出库表中重复的记录。这种方法稍微麻烦一些,为了使用“excepeion into ”子句,必须首先创建 exceptions 表。创建该表的 sql 脚本文件为 utlexcpt.sql 。对于win2000系统和 unix 系统, oracle 存放该文件的位置稍有不同,在win2000系统下,该脚本文件存放在$oracle_home\ora90\rdbms\admin 目录下;而对于 unix 系统,该脚本文件存放在$oracle_home/rdbms/admin 目录下。
具体步骤如下:
sql>@?/rdbms/admin/utlexcpt.sql
table created.
sql>desc exceptions
name null? type
----------------------------------------- -------- --------------
row_id rowid
owner varchar2(30)
table_name varchar2(30)
constraint varchar2(30)
sql>alter table cz add constraint cz_unique unique(c1,c10,c20) exceptions into exceptions;
*
error at line 1:
ora-02299: cannot validate (test.cz_unique) - duplicate keys found
sql>create table dups as select * from cz where rowid in (select row_id from exceptions);
table created.
sql>select * from dups;
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
16 rows selected.
sql>select row_id from exceptions;
row_id
------------------
aaahd/aaiaaaadsaaa
aaahd/aaiaaaadsaab
aaahd/aaiaaaadsaac
aaahd/aaiaaaadsaaf
aaahd/aaiaaaadsaah
aaahd/aaiaaaadsaai
aaahd/aaiaaaadsaag
aaahd/aaiaaaadsaad
aaahd/aaiaaaadsaae
aaahd/aaiaaaadsaaj
aaahd/aaiaaaadsaak
aaahd/aaiaaaadsaal
aaahd/aaiaaaadsaam
aaahd/aaiaaaadsaan
aaahd/aaiaaaadsaao
aaahd/aaiaaaadsaap
16 rows selected.
sql>delete from cz where rowid in ( select row_id from exceptions);
16 rows deleted.
sql>insert into cz select distinct * from dups;
3 rows created.
sql>select *from cz;
c1 c10 c20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
4 5 err
5 3 dar
6 1 wee
7 2 zxc
7 rows selected.
从结果里可以看到重复记录已经删除。
下面总结一下几种查找和删除重复记录的方法(以表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
(select min(rowid) from cz group by c1,c10,c20 having count(*)>1);
sql>delete cz where rowid not in(select min(rowid) from cz group by c1,c10,c20);
(2).适用于有少量重复记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):
sql>delete from cz a where a.rowid!=(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);
sql>delete from cz a where a.rowid<(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);
sql>delete from cz a where rowid <(select max(rowid) from cz where c1=a.c1 and c10=a.c10 and c20=a.c20);
(3).适用于有少量重复记录的情况(临时表法):
sql>create table test as select distinct * from cz; (建一个临时表test用来存放重复的记录)
sql>truncate table cz; (清空cz表的数据,但保留cz表的结构)
sql>insert into cz select * from test; (再将临时表test里的内容反插回来)
(4).适用于有大量重复记录的情况(exception into 子句法):
采用alter table 命令中的 exception into 子句也可以确定出库表中重复的记录。这种方法稍微麻烦一些,为了使用“excepeion into ”子句,必须首先创建 exceptions 表。创建该表的 sql 脚本文件为 utlexcpt.sql 。对于win2000系统和 unix 系统, oracle 存放该文件的位置稍有不同,在win2000系统下,该脚本文件存放在$oracle_home\ora90\rdbms\admin 目录下;而对于 unix 系统,该脚本文件存放在$oracle_home/rdbms/admin 目录下。
具体步骤如下:
sql>@?/rdbms/admin/utlexcpt.sql
table created.
sql>desc exceptions
name null? type
----------------------------------------- -------- --------------
row_id rowid
owner varchar2(30)
table_name varchar2(30)
constraint varchar2(30)
sql>alter table cz add constraint cz_unique unique(c1,c10,c20) exceptions into exceptions;
*
error at line 1:
ora-02299: cannot validate (test.cz_unique) - duplicate keys found
sql>create table dups as select * from cz where rowid in (select row_id from exceptions);
table created.
sql>select * from dups;
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
16 rows selected.
sql>select row_id from exceptions;
row_id
------------------
aaahd/aaiaaaadsaaa
aaahd/aaiaaaadsaab
aaahd/aaiaaaadsaac
aaahd/aaiaaaadsaaf
aaahd/aaiaaaadsaah
aaahd/aaiaaaadsaai
aaahd/aaiaaaadsaag
aaahd/aaiaaaadsaad
aaahd/aaiaaaadsaae
aaahd/aaiaaaadsaaj
aaahd/aaiaaaadsaak
aaahd/aaiaaaadsaal
aaahd/aaiaaaadsaam
aaahd/aaiaaaadsaan
aaahd/aaiaaaadsaao
aaahd/aaiaaaadsaap
16 rows selected.
sql>delete from cz where rowid in ( select row_id from exceptions);
16 rows deleted.
sql>insert into cz select distinct * from dups;
3 rows created.
sql>select *from cz;
c1 c10 c20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
4 5 err
5 3 dar
6 1 wee
7 2 zxc
7 rows selected.
从结果里可以看到重复记录已经删除。
发表评论
-
软件开发需要的文档
2011-08-18 18:26 0软件开发需要的文档 201 ... -
追女生秘籍:情场高手分享成功追女友秘籍
2011-08-17 09:11 0One: 学会如何跟女生“ ... -
ifttt
2011-08-09 16:57 935国人的众多狂想则将ifttt的应用场景推向了无所不能的 ... -
莫在fetion api上浪费时间了
2011-08-04 21:10 3139fetion官方从来没有出过api, 所有的api都是第三方 ... -
好用工具汇总
2011-06-27 17:21 790整理一些用的到得软件工具,持续更新。 swiff chart ... -
Godaddy创始人:成就亿万富翁的10条规则
2011-06-27 14:02 725GoDaddy是一家主要向用户 ... -
将java应用放到U盘里
2011-06-24 16:24 1067很多事情源于现实生活。 这个也不例外。 一哥们,老哥要结婚 ... -
技术标签-当前主流思路
2011-06-24 15:14 7850.视频网站的实现步骤--优酷 用户自己上传视频, 网站先将其 ... -
做了一个艰难的决定
2011-06-17 15:56 736这个决定很艰难, 我还是下定了决心。 努力, 去追寻自己 ... -
强人是怎样练成的。
2011-05-19 23:04 708沟通>业务>技术。 技术是最最次要的。 但作为一个 ... -
“曾经沧海难为水,除却巫山不是云”
2011-05-17 13:48 817曾经接触过大海,从此就觉得,其他的“水(如:江河湖之水 ... -
飞鸟尽良弓藏:历代皇帝为何都要杀功臣
2011-05-17 09:54 769“飞鸟尽,良弓藏”,在中华帝国几千年的历史上,周而复始 ... -
沉思:美国兰德公司对中国人的评价
2011-05-15 16:31 772美国兰德公司是一家著 ... -
HTC G7上网设置和简单操作
2011-05-01 11:20 1193第一步,设置CMNET上网 新建APN 1.名称:cmnet ... -
据说看完了,能少奋斗30年
2011-03-28 19:19 864第一:不要认为停留在 ... -
老爸,我想念你,老爸,我想念你,老爸,我想念你。你能听见吗?
2011-03-27 21:33 1000老爸,我想念你。 老爸,我想念你。 老爸,我想念你。 你能 ... -
人生是什么?
2011-03-23 14:25 688人生是什么? 是一个未知的梦。 -
清炒芹菜
2011-03-15 20:39 838原料:芹菜500克,植物油、花椒、葱花、姜末、盐、酱油各适量。 ... -
中国人的“智慧”
2011-03-12 23:05 675今天看到一款网络电视棒, USB Internet Radio ... -
做功课,提酒时可以用到
2011-02-25 16:42 864欲穷千里目,更上一层楼:爱情事业更上一层楼。 不知细叶谁裁出 ...
相关推荐
### Oracle中用Rowid查找和删除表中的重复记录 在Oracle数据库管理中,处理重复记录是一项常见的需求,尤其是在数据量较大的情况下。本文将详细介绍如何利用Rowid这一特性来有效地查找和删除表中的重复记录。 ####...
### Oracle数据库删除表中重复记录的方法 在Oracle数据库管理中,经常会遇到需要处理表中的重复数据的情况。重复数据不仅会占用不必要的存储空间,还可能导致数据统计错误或业务逻辑混乱等问题。因此,掌握如何有效...
伪列类似于数据表的列,建立表时,数据库会自动为每个表建立rowid列,但它实际上不存储在表中,因此,当用desc命令来查看任何一个表的结构时,都不会显示有rowid这一列存在。 rowid的概念 在Oracle官方文档中,对...
mysql虚拟了一个rowid(类似跟oracle的rowid)--SQL语句
删除重复记录的方法原理:在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会...
删除数据库中重复记录是数据库管理中一个常见的问题,特别是在数据量庞大的时候。今天,我们将讨论删除数据库中重复记录的经典方法,包括使用 SQL 语句和其他技巧。 查找表中多余的重复记录 要删除数据库中重复...
### 如何高效删除Oracle数据库中的重复数据 在Oracle数据库管理中,经常会出现因各种原因导致的数据重复问题。这些重复数据不仅占用存储空间、降低查询效率,还可能导致数据分析时出现错误的结果。因此,学会如何...
每行记录在Oracle数据库中都会有一个Rowid,相当于一个物理地址,即使该行数据在数据库中发生了迁移,其Rowid也不会改变。在处理大量数据的情况下,对Rowid的使用可以大幅提高数据访问的效率。 在Oracle数据库中,...
根据给定的文件标题、描述和部分内容,我们可以深入探讨Oracle数据库中删除重复记录的方法,这对于维护数据完整性和提高系统性能至关重要。以下将详细介绍几种在Oracle数据库中有效删除重复记录的技术。 ### 1. ...
在数据库设计和管理中,掌握Rowid的特性有助于优化表结构,合理利用索引,提高数据存取效率。例如,通过分析Rowid的分布,可以评估表空间的使用情况,预测可能的热点问题,从而进行必要的表分区或索引策略调整。 ...
位图索引可以快速找到表记录,并且可以将位的位置转换为实际的 ROWID。位图索引的创建语法为:create bitmap index 索引名 on 表名(列名)。位图索引可以合并简化查询条件,从而过滤被访问的数据集合。 簇索引是一种...
在实际应用中,删除重复记录是非常常见的操作,特别是在数据导入、数据整合和数据清洁等场景中。Oracle数据库提供了多种方式来查询和删除重复记录,本文将详细介绍这些方法。 查找表中多余的重复记录 使用子查询...
最后,我们可以使用以下语句来查找表中多余的重复记录(多个字段),不包含 rowid 最小的记录: ```sql select * from R_RESOURCE_DETAILS a where (a.FIELD_CODE,a.DTA_ITEM_NAME) in (select FIELD_CODE,DTA_ITEM...
在Oracle数据库中,`ROWNUM` 和 `ROWID` 是两个非常重要的概念,它们可以帮助我们在查询数据时实现更灵活的数据管理。本文将详细介绍这两个概念的区别及其使用方法,并通过示例来帮助读者更好地理解。 #### 一、...
在数据库管理中,经常会遇到数据清理的需求,尤其是在Oracle数据库中处理重复记录时。本文旨在通过对比几种不同的方法来删除Oracle中的重复记录,并分析其性能差异,从而为数据库管理员提供有效的解决方案。 #### ...
特别是在大型企业级应用中,由于各种原因(如数据导入错误、系统故障等),数据库表中可能会出现大量的重复记录,这对数据的准确性和系统的性能都会产生负面影响。因此,掌握如何有效地识别并删除这些重复记录显得尤...
30.删除表内重复记录的方法 31.数据库安全性策略 32.数据库的查询优化技术. 33.提高C-S系统性能的一些方法 34.提高ORACLE数据库系统import性能 35.外部联接的用法 36.性能调试的一般问题 37.优化 38...
在Oracle数据库中,删除重复数据是一项常见的数据清洗任务,尤其当表设计不当时,重复数据可能导致数据不一致和分析错误。以下将详细解释如何在Oracle中处理这两种类型的重复数据问题:部分字段重复和完全重复记录。...