`
todayapple
  • 浏览: 40798 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle 去重

阅读更多
oracle去重:综合了别人的记录,大致有以下两种看起来顺眼。但速度如何,暂没时间验证。

1.delete from t
where   rowid   not   in   (select   min(rowid)   from   t   group   by   去重字段);

2.(注意:distinct是记录完全一致的重复。而上面是以某一列的值是否重复来决定)
insert into 临时表 select distinct mobile from 原表;
drop table 原表;
rename 临时表名 to 原表名;

根据原评论,第二种方法经常用在数据迁移等方面,如有此需求,可以验证。

*****************************

而这位老兄写了挺多,先跟作者说声辛苦啦,俺也在加班,暂不详细研究。详文如下:

重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。
一、对于部分字段重复数据的删除
        先来谈谈如何查询重复的数据吧。
        下面语句可以查询出那些数据是重复的:
select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1
        将上面的>号改为=号就可以查询出没有重复的数据了。
        想要删除这些重复的数据,9@SsJ`垠d,zw*~可以使用下面语句进行删除
delete from 表名 a where 字段1,字段2 in
    (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)
        上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,件V6dW9@中WG]n供J7这样,执行删除的时候就不用再进行一次查询了。如下:
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
)
       下面我就来讲解一下,中.;&垠TfBI05[L(E无1Ix.I8^DMx业育g|上面括号中的语句是查询出重复数据中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 表名);
drop table 正式表;
insert into 正式表 (select * from 临时表);
drop table 临时表;

      如果想删除一个表的重复数据,)7yj网件4[e~,mW^可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从
临时表将数据导入正式表中,如下:
INSERT INTO t_table_bak
select distinct * from t_table;
分享到:
评论

相关推荐

    oracle去重语句

    oracle去重语句 ,批量设置,去除重复以及空格racle去重语句racle去重语句

    oracle字段去重

    ### Oracle字段去重详解 #### 一、Oracle字段去重概念与应用场景 在数据库操作过程中,数据表中可能会出现重复的数据记录,这不仅浪费存储空间,还可能导致数据分析时出现错误的结果。因此,去除重复记录是数据库...

    oracle本表去重的语句优化

    在Oracle数据库中,进行表内数据去重是一项常见的任务,特别是在处理大量数据时。面对一个包含一亿条记录,且每个记录只有一个字段`mobile`的`bao_mobile_temp`表,如何高效地去除重复数据,是本文要探讨的核心问题...

    OracleSQL实例-删除重复数据行留最新日期实例.pdf

    在Oracle SQL中,删除重复数据并保留最新日期的实例是一个常见的数据清理任务,尤其是在具有历史记录或事务数据的数据库中。这个实例展示了如何通过SQL查询有效地处理这种情况。在这个例子中,我们有一个名为`abc`的...

    oracle-字符串去重函数

    传入一个字符串和该字符串的分割字符,返回去重后的字符串,可以直接在plsql中运行,简单的函数运用,能处理oracle中。资源仅供参考

    oracle 删除去掉重复项

    在Oracle数据库管理中,处理数据冗余和删除重复项是一项重要的任务,这有助于维护数据的完整性和提升查询效率。本文将深入探讨Oracle中删除和处理重复数据的方法,特别是基于提供的内容,我们将详细解析如何通过SQL...

    oracle连续重复行去重

    ### Oracle连续重复行去重详解 在Oracle数据库中,处理连续重复行的去重操作是一项常见但又具有一定挑战性的任务。特别是当需要合并特定条件下连续出现的记录时,这一过程会更加复杂。本文将深入探讨如何实现...

    wm_concat函数DDL.zip

    在Oracle数据库中,`wm_concat`函数曾是一个非常实用的工具,用于将多个行的数据合并成单个字符串,尤其在需要进行数据汇总时非常方便。然而,从Oracle 11g版本开始,出于性能和安全性的考虑,Oracle官方取消了这个...

    解决Oracle删除重复数据只留一条的方法详解

    在Oracle数据库管理中,有时我们需要清理表中的重复数据,确保数据的唯一性和准确性。本文将详细探讨如何在Oracle中删除重复数据,仅保留一条记录。这个过程通常涉及到查询重复数据,然后选择要保留的特定记录,并...

    Oracle表中重复数据去重的方法实例详解

    在Oracle数据库管理中,处理重复数据是常见的任务,特别是在数据清洗和数据分析阶段。本文将深入探讨Oracle表中如何有效地去除重复数据,通过实例详细解析这一过程。 首先,我们需要理解什么是重复数据。在数据库中...

    oracle删除重复数据的sql语句

    根据给定文件中的标题、描述、标签以及部分内容,本文将详细介绍在Oracle数据库中删除重复数据的几种方法。这些方法利用了ROWID、GROUP BY、DISTINCT等关键字来实现数据去重的功能。 ### 1. 使用ROWID进行去重 ...

    oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf

    Oracle 实现行转列功能并使用逗号进行隔开拼接成为一条数据 Oracle 中实现行转列功能,并使用逗号进行隔开拼接,成为一条数据是指将多行数据合并成一行数据,并用逗号分隔每个字段的值。这种功能在实际应用中非常...

    Oracle经典面试总结-去重-附答案.pdf

    Oracle经典面试总结 本文档总结了 Oracle 数据库相关的面试问题和答案,涵盖了 optimizer_mode、CBO、RBO、索引、排序、表空间、回滚段、绑定变量、SQL 优化等多个方面的知识点。 _optimizer_mode_ Optimizer_...

    sql_按照某一个字段进行去重后获取全部字段

    根据提供的文件信息,本文将详细解释如何通过 SQL 语句实现按照某一字段去重后获取所有字段的操作。在实际工作中,我们经常会遇到需要对数据表中的记录进行去重的情况,尤其是当某个字段作为唯一标识符时,我们希望...

    oracle中将列拼接字段函数

    在Oracle数据库中,进行数据处理时经常会用到各种各样的函数来满足业务需求。其中,字符串拼接操作是一项非常常见的需求,特别是在需要将多个列值组合成一个单独的字符串时。本文将详细介绍如何使用Oracle中的`WMSYS...

    SQL去重 清除冗余数据

    使用distinct后,Oracle就会在查找的时候对后面的字段进行去重排序,这会对查找的效率带来影响。 删除重复记录可以使用delete语句,例如:delete from Lin_test a where a.id not in (select min(id) from Lin_test...

    cmd创建用户及表数据去重

    根据提供的标题、描述、标签以及部分内容,我们可以提炼出与“cmd创建用户及表数据去重”相关的几个核心知识点,包括如何在命令行模式下创建数据库用户、导入数据、以及实现表数据去重的方法。 ### 一、CMD命令行...

    ORACLE CRC32函数

    ### ORACLE CRC32函数详解 #### 一、概述 在Oracle数据库中,`CRC32`函数是一种非常实用的功能,主要用于将字符类型的数据转换为一个唯一的数字类型,这一过程通常被称为散列(Hash)。通过该函数,可以方便地生成...

Global site tag (gtag.js) - Google Analytics