您正在使用 IPV4 [3.144.187.103] 访问本站,您本次已经查看了 1 页
用户名: 密 码: 验证码:     用QQ登录本站
首页 软件 编程 笑话 知识 公告 台风 日历 计算器
悟空收录网       [公益]保护绿色环境,构建和谐社会      

【腾讯云】2核2G4M云服务器新老同享99元/年,续费同价      
[公益] 地球是我家,绿化靠大家      
2024年 劳动节 002
2024年 端午节 042
2025年 元 旦 247
2025年 春 节 275
 
您现在的位置:首页 >> 数据库 >> 内容
本类新增
本类热门
oracle 删除重复数据
内容摘要: 重复的数据可能有这样两种情况,第一种:表中只有某些字段一样,第二种是两行记录完全一样。一、对于部分字段重复数据的删除1.查询重复的数据select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*)1例:Selectownerfromdba_tablesgroupbyownerhavingcount(*)1;S......
重复的数据可能有这样两种情况,第一种:表中只有某些字段一样,第二种是两行记录完全一样。

一、对于部分字段重复数据的删除

1.查询重复的数据

select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*)>1

例:Selectownerfromdba_tablesgroupbyownerhavingcount(*)>1;

Selectownerfromdba_tablesgroupbyownerhavingcount(*)=1;//查询出没有重复的数据

2.删除重复的数据

deletefrom表名awhere字段1,字段2in(select字段1,字段2,count(*)from表名groupby字段1,字段2havingcount(*)>1)

这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。

另一种高效率的方法是先将查询到的重复的数据插入到一个临时表中,然后再进行删除。

CREATETABLE临时表AS

(

select字段1,字段2,count(*)asrow_num

from表名

groupby字段1,字段2

havingcount(*)>1

);

上面这句话就是建立了临时表,并将查询到的数据插入其中。

下面就可以进行这样的删除操作了:

deletefrom表名a

where字段1,字段2in(select字段1,字段2from临时表);

3.保留重复数据中最新的一条记录

在Oracle中,rowid是隐藏字段,用来唯一标识每条记录。所以,只要保留重复数据中rowid最大的一条记录就可以了。

查询重复数据:

selecta.rowid,a.*from表名a

wherea.rowid!=(

selectmax(b.rowid)from表名b

wherea.字段1=b.字段1anda.字段2=b.字段2);

例:seletefromdba_tablesa

wherea.rowid!=(

selectmax(rowid)fromtestb

wherea.owner=b.owner);

删除重复数据,只保留最新的一条数据:

deletefrom表名a

wherea.rowid!=(

selectmax(b.rowid)from表名b

wherea.字段1=b.字段1anda.字段2=b.字段2)

使用临时表实现高效查询

createtable临时表as

(selecta.字段1,a.字段2,MAX(a.ROWID)asdataidfrom正式表a

GROUPBYa.字段1,a.字段2);

deletefrom表名a

wherea.rowid!=

(selectb.dataidfrom临时表b

wherea.字段1=b.字段1and

a.字段2=b.字段2);

commit;

二、对于完全重复记录的删除

对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:

selectdistinct*from表名

可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:

CREATETABLE临时表AS(selectdistinct*from表名);

droptable正式表;

insertinto正式表(select*from临时表);

droptable临时表;假如想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,如下:INSERTINTOt_table_bak

selectdistinct*fromt_table;

以下是补充:

Oracle数据库中查询重复数据:

select*fromemployeegroupbyemp_namehavingcount(*)>1;

Oracle查询可以删除的重复数据

selectt1.*fromemployeet1where(t1.emp_name)in(SELECTt2.emp_namefromemployeet2groupbyemp_namehavingcount(*)>1)andt1.emp_idnotin(selectmin(t3.emp_id)fromemployeet3groupbyemp_namehavingcount(*)>1);

Oracle删除重复数据

deletefromemployeet1where(t1.emp_name)in(SELECTt2.emp_namefromemployeet2groupbyemp_namehavingcount(*)>1)andt1.emp_idnotin(selectmin(t3.emp_id)fromemployeet3groupbyemp_namehavingcount(*)>1);

版权声明:本内容来源于网络,如有侵犯您的版权,请联系站长,本站收到您的信息后将及时处理。
上一篇:Oracle中的定时任务实例教程

 

下一篇:mysql数据库导出xml的实现方法

发布日期:2023/4/21
手机扫二维码直达本页
发布时间:12:44:17
点  击:16
录  入:齐天大圣
相关文章
Baidu
YiJiaCMS 7.3.8 build231228(MSSQL) 闽ICP备05000814号-1
本空间由腾讯云(轻量应用服务器)提供,奇安信网站卫士提供加速防护
运行时间载入中.....