
如何查找和删除数据库中的重复数据
以Excel2010版本为例,可以直接使用数据→删除重复项的功能来实现删除重复数据。
此功能Excel2007及以上版本均可,WPS中也有这样的功能。另外还可以使用公式法去重复,常用的函数是Countif函数。
重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。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
临时表);
这种先建临时表再进行删除的 *** 作要比直接用一条语句进行删除要高效得多。
这个时候,大家可能会跳出来说,什么你叫我
可以先更新,如果更新条数是0,再进行插入,这样就不会报错了。
数据库(Database)是按照 数据结构来组织、 存储和管理数据的仓库,它产生于距今六十多年前,随着 信息技术和市场的发展,特别是二十世纪九十年代以后, 数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。
数据库有很多种 类型,从最简单的存储有各种数据的 表格到能够进行海量 数据存储的大型 数据库系统都在各个方面得到了广泛的应用。
数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。在信息化社会,充分有效地管理和利用各类信息资源,是进行科学研究和决策管理的前提条件。
数据库是长期储存在计算机内、有组织的、可共享的数据集合。数据库中的数据指的是以一定的数据模型组织、描述和储存在一起、具有尽可能小的 冗余度、较高的数据独立性和易扩展性的特点并可在一定范围内为多个用户共享。
方法一
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字段重复,而其他字段不一定重复或都重复可以忽略。
1、对于第一种重复,比较容易解决,使用 select distinct from tableName 就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct into #Tmp from tableName
drop table tableName
select into tableName from #Tmp
drop table #Tmp
发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
2、这类重复问题通常要求保留重复记录中的第一条记录, *** 作方法如下:
假设有重复的字段为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子句中省去此列)
查询及删除重复记录的SQL语句
1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 ;
select from 表 where Id in (select Id from 表 group byId having count(Id) > 1)
2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录;
DELETE from 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY id HAVING COUNT() > 1);
3、查找表中多余的重复记录(多个字段);
select from 表 a where (aId,aseq) in(select Id,seq from 表 group by Id,seq having count() > 1)
4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录;
delete from 表 a where (aId,aseq) in (select Id,seq from 表 group by Id,seq having count() > 1) and rowid not in (select min(rowid) from 表 group by Id,seq having count()>1)
5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录;
select from 表 a where (aId,aseq) in (select Id,seq from 表 group by Id,seq having count() > 1) and rowid not in (select min(rowid) from 表 group by Id,seq having count()>1)
1,首先,查出数据,重复数据只保留一条。
那就是用到union的时候啦。
select from mytable
union
select from mytable
2,把查询出来的数据备份好
PLSQL中,如果数据少可以直接复制留待粘贴,如果数据量比较大,可以用PLSQL自带的备份查询数据功能
这里写描述
保存成SQL文件,打开你就会发现有一堆insert语句
这里写描述
注意,查询语句的时候一定要记得查出了所有的数据,点击这里写描述 按钮保证查出所有数据这里写描述 箭头按钮呈现灰色即可
3、删除表里的数据
delete from mytable
4、恢复数据
最后,把之前复制的数据粘贴过来,或者 *** 作刚刚导出的SQL文件,执行,导入数据即可。
以上就是关于如何查找和删除数据库中的重复数据全部的内容,包括:如何查找和删除数据库中的重复数据、Oracle数据库重复数据删除的几种方法、怎么防止数据库中插入重复数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)