视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001 知道1 知道21 知道41 知道61 知道81 知道101 知道121 知道141 知道161 知道181 知道201 知道221 知道241 知道261 知道281
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
Oracle数据库中去除重复数据
2020-11-09 13:48:39 责编:小采
文档

在平时的开发中,我们经常遇到数据表中出现重复的数据,那么该如何解决呢?这里介绍两种情况下的数据去重方法,一、完全重复数据去重;二、部分字段数据重复去重。 一、完全重复数据去重方法 对于表中完全重复数据去重,可以采用以下SQL语句。 Code CREATETABL

  在平时的开发中,我们经常遇到数据表中出现重复的数据,那么该如何解决呢?这里介绍两种情况下的数据去重方法,一、完全重复数据去重;二、部分字段数据重复去重。

  一、完全重复数据去重方法

  对于表中完全重复数据去重,可以采用以下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)

  上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库卡死。

  基于上述情况,可以先将查询到的重复的数据插入到一个临时表中,然后对进行删除,,这样,执行删除的时候就不用再进行一次查询了。如下:

  CREATETABLE 临时表 AS

  (select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) > 1)

  下面就可以进行这样的删除操作了:

  deletefrom 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);

  先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。

  上面的语句会把所有重复的全都删除,在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。

  下面是查询重复数据的一个例子:

  select a.rowid,a.* from 表名 a

  where a.rowid !=

  (

  selectmax(b.rowid) from 表名 b

  where a.字段1 = b.字段1 and

  a.字段2 = b.字段2

  )

  上面括号中的语句是查询出重复数据中rowid最大的一条记录。而外面就是查询出除了rowid最大之外的其他重复的数据了。

  由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:

  deletefrom 表名 a

  where a.rowid !=

  (

  selectmax(b.rowid) from 表名 b

  where a.字段1 = b.字段1 and

  a.字段2 = b.字段2

  )

  同理,上述代码的执行效率毕竟低,所以我们可以考虑建立临时表,将需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。

  createtable 临时表 as

  select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUPBY a.字段1,a.字段2;

  deletefrom 表名 a

  where a.rowid !=

  (

  select b.dataid from 临时表 b

  where a.字段1 = b.字段1 and

  a.字段2 = b.字段2

  );

  commit;

下载本文
显示全文
专题