`

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文件夹。





比如现在有一人员表  (表名:peosons)
若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来 
select   p1.*   from   persons   p1,persons   p2   where   p1.id<>p2.id   and   p1.cardid   =   p2.cardid   and  p1.pname   =   p2.pname   and   p1.address   =   p2.address


可以实现上述效果.

几个删除重复记录的SQL语句
 
1.用rowid方法

2.用group by方法

3.用distinct方法

1。用rowid方法

据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:

查数据:

     select * from table1 a where rowid !=(select   max(rowid)  
     from table1 b where a.name1=b.name1 and a.name2=b.name2......)

删数据:

    delete   from table1 a where rowid !=(select   max(rowid)  
     from table1 b where a.name1=b.name1 and a.name2=b.name2......)

2.group by方法

查数据:

  select count(num), max(name) from student --列出重复的记录数,并列出他的name属性 
  group by num 
  having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次 

删数据:

  delete from student 
  group by num 
  having count(num) >1
  这样的话就把所有重复的都删除了。

3.用distinct方法 -对于小的表比较有用

 

create table table_new as   select distinct *   from table1 minux 
truncate table table1;
insert into table1 select * from table_new;

查询及删除重复记录的方法大全

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)


2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
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)


3、查找表中多余的重复记录(多个字段) 
select * from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)


4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录 
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)


5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
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)


(二)
比方说
在A表中存在一个字段“name”,
而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
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字段重复,而其他字段不一定重复或都重复可以忽略。

  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子句中省去此列)

(四)
查询重复
select * from tablename where id in (
select id from tablename 
group by id 
having count(id) > 1
)

 

分享到:
评论
1 楼 datawarehouse 2012-09-14  
有用  

相关推荐

    如何高效删除Oracle数据库中的重复数据

    ### 如何高效删除Oracle数据库中的重复数据 在Oracle数据库管理中,经常会出现因各种原因导致的数据重复问题。这些重复数据不仅占用存储空间、降低查询效率,还可能导致数据分析时出现错误的结果。因此,学会如何...

    excel导入数据到Oracle数据库

    `来查看当前表中的数据情况。 3. **清空表数据**:为了避免数据冲突,可以使用`DELETE FROM tb_ppz_user;`命令清空表中的现有数据。 4. **打开ODBC导入器**: - 在PL/SQL Developer中选择“工具”-&gt;“ODBC导入器”...

    oracle数据库各种删除重复数据方法

    ### Oracle数据库删除重复数据的方法 在Oracle数据库管理中,处理重复数据是一项常见且重要的任务。重复数据不仅会占用额外的存储空间,还可能导致数据分析时出现偏差。因此,掌握如何有效地识别并删除这些重复记录...

    wxh Oracle数据库删除重复记录的方法

    根据给定的文件标题、描述和部分内容,我们可以深入探讨Oracle数据库中删除重复记录的方法,这对于维护数据完整性和提高系统性能至关重要。以下将详细介绍几种在Oracle数据库中有效删除重复记录的技术。 ### 1. ...

    oracle 查询重复数据

    本文将深入探讨如何在Oracle数据库中查询重复数据,理解SQL语句背后的逻辑,并掌握其实现方法。 ### Oracle查询重复数据的核心概念 #### 1. 重复数据的定义 在数据库术语中,重复数据通常指的是在数据集中存在一个...

    Oracle数据库重复数据删除技术的四大优势

    Oracle数据库重复数据删除技术是一种高效的数据管理策略,其核心优势主要体现在以下几个方面: 1. **更大的备份容量**:Oracle数据库的重复数据删除技术通过识别并消除备份数据中的冗余部分,显著减少了所需的存储...

    Oracle删除表中的重复数据

    在Oracle数据库管理中,处理重复数据是一项常见的任务,尤其是在数据清洗、数据迁移或者日常的数据维护过程中。重复数据的存在不仅会占用额外的存储空间,还可能导致数据统计错误、数据分析偏差等问题,因此,有效地...

    Oracle数据库删除表中重复记录的方法三则.txt

    ### Oracle数据库删除表中重复记录的方法 在Oracle数据库管理中,经常会遇到需要处理表中的重复数据的情况。重复数据不仅会占用不必要的存储空间,还可能导致数据统计错误或业务逻辑混乱等问题。因此,掌握如何有效...

    Oracle数据库语句大全.doc

    数据操纵语言(DML)用于操作数据库中的数据,包括插入、删除、更新和查询数据的语句。Oracle 数据库支持多种数据类型,包括字符型、数值型、日期型等。 字符型包括: * CHAR:1-2000 字节的定长字符 * VARCHAR2:...

    ORACLE删除重复数据

    在 ORACLE 数据库中,删除重复数据是一项常见的操作。重复数据的存在可能会导致数据不一致、查询效率下降等问题。今天,我们将介绍三种删除重复数据的方法,并对每种方法的执行时间进行比较。 方法一:使用子查询...

    Oracle数据库安全配置基线.pdf

    Oracle 数据库安全配置基线 本文档旨在指导系统管理人员或安全检查人员进行 Oracle 数据库的安全合规性检查和配置,涵盖了 Oracle 数据库安全配置基线的各个方面。 一、账号安全 账号安全是 Oracle 数据库安全...

    Oracle数据库学习指南

    30.删除表内重复记录的方法 31.数据库安全性策略 32.数据库的查询优化技术. 33.提高C-S系统性能的一些方法 34.提高ORACLE数据库系统import性能 35.外部联接的用法 36.性能调试的一般问题 37.优化 38...

    oracle中如何删除重复数据

    在Oracle数据库中,删除重复数据是一项常见的数据清洗任务,尤其当表设计不当时,重复数据可能导致数据不一致和分析错误。以下将详细解释如何在Oracle中处理这两种类型的重复数据问题:部分字段重复和完全重复记录。...

    Oracle数据库笔记大全

    Oracle数据库是世界上最流行的关系型数据库管理系统之一,广泛应用于企业级数据管理、数据分析和应用程序开发。以下将详细阐述Oracle的一些核心知识点。 1. **基础概念和术语**: - **关系型数据库**: 数据以表格...

    Oracle数据库.pdf

    ### Oracle数据库核心知识点详解 ...总之,Oracle数据库的学习涵盖了从安装部署到日常管理、数据操作以及性能调优等多个方面,对于IT专业人士而言,掌握这些知识是构建和维护高质量数据库系统的关键。

    一种基于重复数据删除的Oracle数据库备份系统.pdf

    【重复数据删除技术】为了解决这个问题,文章提出了基于重复数据删除的Oracle数据库备份系统。该系统通过将临时备份文件分割成不重叠的块,并利用哈希算法计算每个块的指纹值。在灾难恢复中心,建立一个哈希表来记录...

    oracle数据库crt连接工具

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其性能强大,功能丰富,为各种规模的企业提供了数据存储和管理解决方案。为了更加便捷地管理和操作Oracle数据库,DBA(Database Administrator,数据库管理...

    Oracle 数据库2天 DBA

    - **Oracle数据库架构:** 包括数据文件、控制文件、重做日志文件等组成部分。 - **Oracle实例:** 是数据库运行时的内存结构和进程集合。 #### 常用Oracle DBA任务 - **监控:** 监控数据库的性能指标,如CPU使用率、I...

    oracle数据库教案

    若想查询每位雇员的职位并消除重复数据,可以使用`DISTINCT`关键字: ``` SELECT DISTINCT job FROM emp; ``` 通过上述内容,我们不仅掌握了Oracle数据库的基本结构和操作,还深入了解了SQL语言的核心概念及其在...

    oracle下如何删除重复数据的几种方法

    本文介绍了在Oracle数据库中处理重复数据的几种方法。无论是部分字段重复还是完全重复的记录,都可以通过创建临时表的方式提高删除重复记录的效率。此外,在处理重复数据时,还应考虑到保留最新或最旧记录的需求,...

Global site tag (gtag.js) - Google Analytics