- 浏览: 884276 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1096)
- 大数据存储 (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 924国人的众多狂想则将ifttt的应用场景推向了无所不能的 ... -
莫在fetion api上浪费时间了
2011-08-04 21:10 3129fetion官方从来没有出过api, 所有的api都是第三方 ... -
好用工具汇总
2011-06-27 17:21 780整理一些用的到得软件工具,持续更新。 swiff chart ... -
Godaddy创始人:成就亿万富翁的10条规则
2011-06-27 14:02 719GoDaddy是一家主要向用户 ... -
将java应用放到U盘里
2011-06-24 16:24 1057很多事情源于现实生活。 这个也不例外。 一哥们,老哥要结婚 ... -
技术标签-当前主流思路
2011-06-24 15:14 7740.视频网站的实现步骤--优酷 用户自己上传视频, 网站先将其 ... -
做了一个艰难的决定
2011-06-17 15:56 729这个决定很艰难, 我还是下定了决心。 努力, 去追寻自己 ... -
强人是怎样练成的。
2011-05-19 23:04 700沟通>业务>技术。 技术是最最次要的。 但作为一个 ... -
“曾经沧海难为水,除却巫山不是云”
2011-05-17 13:48 809曾经接触过大海,从此就觉得,其他的“水(如:江河湖之水 ... -
飞鸟尽良弓藏:历代皇帝为何都要杀功臣
2011-05-17 09:54 755“飞鸟尽,良弓藏”,在中华帝国几千年的历史上,周而复始 ... -
沉思:美国兰德公司对中国人的评价
2011-05-15 16:31 772美国兰德公司是一家著 ... -
HTC G7上网设置和简单操作
2011-05-01 11:20 1186第一步,设置CMNET上网 新建APN 1.名称:cmnet ... -
据说看完了,能少奋斗30年
2011-03-28 19:19 856第一:不要认为停留在 ... -
老爸,我想念你,老爸,我想念你,老爸,我想念你。你能听见吗?
2011-03-27 21:33 994老爸,我想念你。 老爸,我想念你。 老爸,我想念你。 你能 ... -
人生是什么?
2011-03-23 14:25 680人生是什么? 是一个未知的梦。 -
清炒芹菜
2011-03-15 20:39 834原料:芹菜500克,植物油、花椒、葱花、姜末、盐、酱油各适量。 ... -
中国人的“智慧”
2011-03-12 23:05 675今天看到一款网络电视棒, USB Internet Radio ... -
做功课,提酒时可以用到
2011-02-25 16:42 852欲穷千里目,更上一层楼:爱情事业更上一层楼。 不知细叶谁裁出 ...
相关推荐
基于java的贝儿米幼儿教育管理系统答辩PPT.pptx
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
基于java的消防物资存储系统答辩PPT.pptx
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
TA_lib库(whl轮子),直接pip install安装即可,下载即用,非常方便,各个python版本对应的都有。 使用方法: 1、下载下来解压; 2、确保有python环境,命令行进入终端,cd到whl存放的目录,直接输入pip install TA_lib-xxxx.whl就可以安装,等待安装成功,即可使用! 优点:无需C++环境编译,下载即用,方便
使用软件自带的basic脚本编辑制作的脚本 低版本软件无法输出Excel报告,可以通过脚本方式实现这一功能
基于java的就业信息管理系统答辩PPT.pptx
25法理学背诵逻辑.apk.1g
基于java的大学生校园兼职系统答辩PPT.pptx
做到代码,和分析的源数据
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
适用于ensp已经入门人群的学习,有一定难度
基于java的数码论坛系统设计与实现答辩PPT.pptx
tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl
基于java的医院信管系统答辩PPT.pptx
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
tornado-4.2.tar.gz
链表 合并两个链表,链表基础操作