Oracle删除部分字段重复和彻底重复记录的方法

 随着数据库容量的日益变大,表中的数据极有可能会重复出现,使咱们对数据库的操做过程当中带来不少的不便,那么怎么删除这些重复没有用的数据呢?数据库

    重复数据删除技术能够提供更大的备份容量,实现更长时间的数据保留,还能实现备份数据的持续验证,提升数据恢复服务水平,方便实现数据容灾等。 重复的数据可能有这样两种状况,第一种时表中只有某些字段同样,第二种是两行记录彻底同样。Oracle数据库重复数据删除技术有以下优点:更大的备份容量、数据能获得持续验证、有更高的数据恢复服务水平、方便实现备份数据的容灾。oracle

    1、删除部分字段重复数据ide

    先来谈谈如何查询重复的数据吧。大数据

    下面语句能够查询出那些数据是重复的:it

    select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1table

    将上面的>号改成=号就能够查询出没有重复的数据了。class

    想要删除这些重复的数据,可使用下面语句进行删除效率

    delete from 表名 a where 字段1,字段2 inselect

    (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;


2、彻底删除重复记录

    对于表中两行记录彻底同样的状况,能够用下面语句获取到去掉重复数据后的记录:

    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;

    3、怎样快速删除oracle数据库

    最快的方法就进入注册表 在运行……里输入regedit.

    依次展开HKEY_LOCAL_MACHINE SOFTWARE

    找到ORACLE节点。删除。

    而后删除ORACLE数据文件,安装的时候选的路径。

    最后删除oracle引导文件,在系统盘符的Program Files 里面删除oracle文件夹。

相关文章
相关标签/搜索