Oracle去重数据

6 篇文章 0 订阅

创建测试表:

-- 创建test2
CREATE TABLE TEST2
(
    ID NUMBER(8) PRIMARY KEY NOT NULL,
    NAME CHAR(8) NOT NULL,
    AGE NUMBER(8) NULL,
    SEX CHAR(2) NULL,
    HOBBY VARCHAR2(200) NULL
);
insert into TEST2 (ID, NAME, AGE, SEX, HOBBY)
values (7, '武器大师', 14, '男', '打野');

insert into TEST2 (ID, NAME, AGE, SEX, HOBBY)
values (8, '嫦娥    ', 14, '女', '打野');

insert into TEST2 (ID, NAME, AGE, SEX, HOBBY)
values (9, '猴子    ', 14, '男', '吃桃');

insert into TEST2 (ID, NAME, AGE, SEX, HOBBY)
values (1, '齐天大圣', 14, '男', '打野');

insert into TEST2 (ID, NAME, AGE, SEX, HOBBY)
values (2, '猪八戒  ', 48, '男', '吃货');

insert into TEST2 (ID, NAME, AGE, SEX, HOBBY)
values (5, '紫霞仙子', 22, '女', '至尊宝');

insert into TEST2 (ID, NAME, AGE, SEX, HOBBY)
values (6, '哇哈哈  ', 34, '女', '睡觉');

在这里插入图片描述
**

在这里我以age和hobby两者都重复作为重复条件

**
1、要删除的数据量比较小的话,直接查询出重复的数据,然后delete删除,2个方法:
方法1:

select a.* from test2 a where (a.age,a.hobby) in
(select age,hobby from test2 group by age,hobby having count(1)>1)
and 
a.rowid not in
(select min(rowid) from test2 group by age,hobby having count(1)>1);

方法2,利用rowid进行比较删除:

select m.* from test2 m where m.rowid>
(select min(rowid) from test2 n where m.age=n.age and m.hobby=n.hobby);

2、数据量大的话,不但很费时间,还有可能导致数据库卡死,这个时候可以通过创建临时表解决:

create table temp_table
as
select * from
having count(条件)>1 --查询重复的数据,并只显示一条
union all
select * from……
having count(条件)=1

例如:

create table temp_table
as
select * from test2 aa where  aa.rowid in --注意这里是in,不是not in
(select min(rowid) from test2 group by age,hobby having count(1)>1)
--上半部分是查询重复数据,并显示一条
union all
select * from test2 where (age,hobby) in
(select age,hobby from test2 group by age,hobby having count(1)=1);
--下半部分是查询非重复数据

另一种是利用比较rowid的方法,上面已经写过,如下,变换一下:

select * from test2 h where h.rowid in
(select min(rowid) from test2 j where h.age=j.age and h.hobby=j.hobby)
-- 直接查询去重之后的数据

以上是将去重的数据放入创建的临时表中,然后清空数据重复的表:

truncate table test2;

接着将临时表的数据转到目标表:

insert into test2 select * from  temp_table;

最后删除临时表:

drop table temp_table(临时表);

最后的效果:
在这里插入图片描述
开始的状态:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值