十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
正在看的ORACLE教程是:oracle快速删除重复的记录。做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的。这个表的数据是千万级的,而且是生产系统。也就是说,不能把所有的记录都删除,而且必须快速的把重复记录删掉。
成都创新互联公司服务项目包括舟山网站建设、舟山网站制作、舟山网页制作以及舟山网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,舟山网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到舟山省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
对此,总结了一下删除重复记录的方法,以及每种方法的优缺点。
为了陈诉方便,假设表名为Tbl,表中有三列col1,col2,col3,其中col1,col2是主键,并且,col1,col2上加了索引。
1、通过创建临时表
可以把数据先导入到一个临时表中,然后删除原表的数据,再把数据导回原表,SQL语句如下:
creat table tbl_tmp (select distinct* from tbl);truncate table tbl;//清空表记录insert into tbl select * from tbl_tmp;//将临时表中的数据插回来。
这种方法可以实现需求,但是很明显,对于一个千万级记录的表,这种方法很慢,在生产系统中,这会给系统带来很大的开销,不可行。
2、利用rowid
在oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会相同。SQL语句如下:
delete from tbl where rowid in (select a.rowid from tbl a, tbl b where a.rowidb.rowid and a.col1=b.col1 and a.col2 = b.col2)
如果已经知道每条记录只有一条重复的,这个sql语句适用。但是如果每条记录的重复记录有N条,这个N是未知的,就要考虑适用下面这种方法了。
3、利用max或min函数
这里也要使用rowid,与上面不同的是结合max或min函数来实现。SQL语句如下
delete from tbl awhere rowid not in (select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//这里max使用min也可以
或者用下面的语句
delete from tbl awhere rowid(select max(b.rowid) from tbl b where a.col1=b.col1 and a.col2 = b.col2);//这里如果把max换成min的话,前面的where子句中需要把""改为""
跟上面的方法思路基本是一样的,不过使用了group by,减少了显性的比较条件,提高效率。SQL语句如下:
deletefrom tbl where rowid not in (select max(rowid) from tbl tgroup by t.col1, t.col2);delete from tbl where (col1, col2) in (select col1,col2 from tblgroup bycol1,col2havingcount(*) 1)and rowidnotin(selectnin(rowid)fromtblgroup bycol1,col2havingcount(*) 1)
还有一种方法,对于表中有重复记录的记录比较少的,并且有索引的情况,比较适用。假定col1,col2上有索引,并且tbl表中有重复记录的记录比较少,SQL语句如下4、利用group by,提高效率
select * from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) 1)
delete from people
where peopleId in (select peopleId from people group by peopleId having count(peopleId) 1)
and rowid not in (select min(rowid) from people group by peopleId having count(peopleId
)1)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) 1)
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)1)
select * from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having
count(*) 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)1)
Select Name,Count(*) From A Group By Name Having Count(*) 1
Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) 1
declare @max integer,@id integer
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having
count(*) ; 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主字段 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重
复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写
在select子句中省去此列)
select * from tablename where id in (
select id from tablename
group by id
having count(id) 1
)
Oracle数据库重复的数据一般有两种去重方法,一、完全重复数据去重;二、部分字段数据重复去重。
一、完全重复数据去重方法
对于表中完全重复数据去重,可以采用以下SQL语句。
Code
CREATETABLE"#temp"AS (SELECTDISTINCT * FROM 表名);--创建临时表,并把DISTINCT 去重后的数据插入到临时表中
truncateTABLE 表名;--清空原表数据
INSERTINTO 表名(SELECT * FROM"#temp");--将临时表数据插入到原表中
DROPTABLE"#temp";--删除临时表
具体思路是,首先创建一个临时表,然后将DISTINCT之后的表数据插入到这个临时表中;然后清空原表数据;再讲临时表中的数据插入到原表中;最后删除临时表。
二、部分数据去重方法
首先查找重复数据
select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) 1
将上面的号改为=号就可以查询出没有重复的数据了。
想要删除这些重复的数据,可以使用下面语句进行删除:
deletefrom 表名 a where 字段1,字段2 in
(select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) 1)
oracle产品服务
甲骨文公司产品主要有以下几类:
甲骨文股份有限公司
1.服务器及工具
数据库服务器:2013年最新版本Oracle 12C。
应用服务器:Oracle Application Server。
开发工具:OracleJDeveloper,Oracle Designer,Oracle Developer,等等。
2.企业应用软件
企业资源计划(ERP)软件。已有10年以上的历史。2005年,并购了开发企业软件的仁科软件公司(PeopleSoft)以增强在这方面的竞争力。
客户关系管理(CRM)软件。自1998年开始研发这种软件。2005年,并购了开发客户关系管理软件的希柏软件公司(Siebel)。
3. Oracle职业发展力计划(Oracle WDP)
Oracle WDP 全称为Oracle Workforce Development Program,是Oracle (甲骨文)公司专门面向学生、个人、在职人员等群体开设的职业发展力课程。Oracle的技术广泛应用于各行各业,其中电信、电力、金融、政府及大量制造业都需要Oracle技术人才,Oracle公司针对职业教育市场在全球推广的项目,其以低廉的成本给这部分人群提供Oracle技术培训,经过系统化的实训,让这部分人群能够迅速掌握Oracle最新的核心技术,并能胜任企业大型数据库管理、维护、开发工作。
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断。
2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录。
3、查找表中多余的重复记录(多个字段)。
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录。
5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录。就完成了。
select col1,col2,count(*)
from tab_1
group by col1,col2
having count(*) 1;
查出来重复数据了
然后
delete tab_1 a where rowid in (
select max(rowid) from tab_1 b
where a.col1=b.col1
and a.col2=b.col2
);
OK,搞定!
记住了,删除之前一定要先备份,在查询是不是要删除的数据,然后再删除。