高效删除Oracle数据库中重复数据,并保留最新一条的方法
在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来很多的不便,那么怎么删除这些重复没有用的数据呢?
重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留,还能实现备份数据的持续验证,提高数据恢复服务水平,方便实现数据容灾等。 重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。Oracle数据库重复数据删除技术有如下优势:更大的备份容量、数据能得到持续验证、有更高的数据恢复服务水平、方便实现备份数据的容灾。
一、删除部分字段重复数据
先来谈谈如何查询重复的数据吧。
下面语句可以查询出那些数据是重复的:
select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1
将上面的>号改为=号就可以查询出没有重复的数据了。
想要删除这些重复的数据,可以使用下面语句进行删除
delete from 表名 a where 字段1,字段2 in
(select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:
CREATE TABLE 临时表 AS
(select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
上面这句话就是建立了临时表,并将查询到的数据插入其中。
下面就可以进行这样的删除操作了:
delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);
这种先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。
这个时候,大家可能会跳出来说,什么?你叫我们执行这种语句,那不是把所有重复的全都删除吗?而我们想保留重复数据中最新的一条记录啊!大家不要急,下面我就讲一下如何进行这种操作。
在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,
我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。
下面是查询重复数据的一个例子:
select a.rowid,a.* from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)
下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。
而外面就是查询出除了rowid最大之外的其他重复的数据了。
由此, 我们要删除重复数据,只保留最新的一条数据 ,就可以这样写了:
delete from 表名 a
where a.rowid !=
(
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
)
随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。
create table 临时表 as
select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;
delete from 表名 a
where a.rowid !=
(
select b.dataid from 临时表 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2
);
commit;
二、完全删除重复记录
对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:
select distinct * from 表名
可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:
CREATE TABLE 临时表 AS (select distinct * from 表名);
truncate table 正式表; --注:原先由于笔误写成了drop table 正式表;,现在已经改正过来
insert into 正式表 (select * from 临时表);
drop table 临时表;
如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从
临时表将数据导入正式表中,如下:
INSERT INTO t_table_bak
select distinct * from t_table;
三、怎样快速删除oracle数据库
最快的方法就进入注册表 在运行..里输入regedit.
依次展开HKEY_LOCAL_MACHINE SOFTWARE
找到ORACLE节点。删除。
然后删除ORACLE数据文件,安装的时候选的路径。
最后删除oracle引导文件,在系统盘符的Program Files 里面删除oracle文件夹。
高效删除Oracle数据库中重复数据,并保留最新一条的方法相关推荐
- oracle中如何去掉重复的数据库,关于如何删除Oracle数据库中重复记录
看了点Oracle数据库的东西,因为遇到了一些数据库的问题.对于Oracle数据库一个表中的记录,如果有重复值如何进行删除.我现在将 看了点Oracle数据库的东西,因为遇到了一些数据库的问题. 对于 ...
- MySQL删除重复数据只保留最新的一条
MySQL删除重复数据并保留最新的一条,网上有些博客写的有问题,因为他们只考虑到或者说他们的重复数据最多只有两条,当重复数据大于2时,就会出现问题. 案例描述: 按天删除表中重复数据只保留最新的一条( ...
- 查找数据库中重复数据T-SQL
查找数据库中重复数据T-SQL ========第一篇========= 在一张表中某个字段下面有重复记录,有很多方法,但是有一个方法,是比较高效的,如下语句: select data_guid fr ...
- oracle数据库速度测试,【原创】验证在Oracle数据库中操纵数据的各种方法的速度...
机器配置:组装的PC SERVER,4AMD CPU,8G内存,4块SCSI硬盘.Oracle 10.2.0.4. 试验目的:在244上,对xxx_flow表进行复制.更新,验证在Oracle数据库中 ...
- win7 oracle数据库删除用户名,图文帮你win7系统删除Oracle数据库中的用户的具体方法...
许多win7系统用户在工作中经常会遇到对win7系统删除Oracle数据库中的用户进行操作的情况,比如近日有用户到本站反映说win7系统删除Oracle数据库中的用户的情况,但是却不知道要怎么操作wi ...
- mysql 删除表中重复数据并保留一条
最近有个需求,给角色添加菜单权限,这是一个role_menu 表.里面存放的是角色id和菜单id,是批量给一种类型角色添加,但有可能角色人为添加过,因为数据量还是比较大的,如果先查询这个有没有添加过再 ...
- Oracle数据库中调用Java类开发存储过程、函数的方法
Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日 浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...
- shell脚本实现删除过期数据库中的数据
一个应用系统每天都需不间断的向数据库中插入数据,而对于很早之前的数据一般都需要从数据库中清理,防止数据量无限增大,耗费存储和影响数据查询效率. 通过两个文件实现,一个文件为配置文件,一个为脚本文件. ...
- 【转】删除数据库中重复数据的几个方法
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置-- 方法一 declare @max integer,@id integer declare cur ...
最新文章
- 大厂前端高频面试问题与答案精选
- 正则表达式的常用方法和属性
- Android监听后台状态,退出即杀死并显示退出提示框
- 牛客网编程题python输入输出_牛客网算法题目记录
- 【机器视觉】 dev_set_draw算子
- linux克隆后重新封装,克隆后立即在OSX上修改Linux内核源代码
- Windows Server 2012安装 .NET Framework 3.5
- 查看linux目录剩余空间大小
- SaltStack 拉取和推送文件
- Redhat=》中文
- 【引用】我国一、二级学科目录
- HBase二级索引的设计
- 银河麒麟操作系统常用问题及解决方法
- HTML5制作个人理财系统,个人股票理财专题页面html模板
- 赞!WEB设计之路!网络视觉艺术发展史概览
- 数据挖掘-决策树算法的R实现
- 微信朋友圈怎么发文字?纯文字动态发布教程
- 《Web性能权威指南》笔记
- 常熟理工php实验三_常熟理工Oracle实验三_高燕教授
- LabVIEW如何实现高性能串口助手-附代码