我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢?
重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。
一、对于部分字段重复数据的删除
先来谈谈如何查询重复的数据吧。
下面语句可以查询出那些数据是重复的:
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 表名); drop table 正式表; insert into 正式表 (select * from 临时表); drop table 临时表;
如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,如下:
INSERT INTO t_table_bakselect distinct * from t_table;
重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。
一、对于部分字段重复数据的删除
先来谈谈如何查询重复的数据吧。
下面语句可以查询出那些数据是重复的:
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 表名); drop table 正式表; insert into 正式表 (select * from 临时表); drop table 临时表;
如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从临时表将数据导入正式表中,如下:
INSERT INTO t_table_bakselect distinct * from t_table;
发表评论
-
ORACLE 两个表或两个结果集的数据对比常用的函数
2017-04-19 15:13 1016假设有两个表A,B,都只有一个字段PHONE 1、MIN ... -
Oracle删除重复数据,并只保留一条记录
2016-07-16 13:09 28861、查找表中多余的重复记录,重复记录是根据单个字段(Id)来 ... -
客户端连接虚拟机Oracle服务器错误
2016-01-14 00:51 13971.在虚拟机上安装Oracle ... -
ETL -- ORACLE -- CDC技术
2015-09-22 14:08 1676ETL: Extract(抽取) ... -
影子数据库
2015-09-18 12:31 4839什么是数据库中的影子文件? A shadow file ... -
ETL的一些概念
2015-09-17 16:57 1741一、Analysis - 分析:1. ... -
JAVA createSQLQuery().list()返回日期格式没有时分秒的解决方法
2015-01-21 14:50 1879在开发web项目中,发现提取Oracle中某 ... -
Oarcle中oracleHomeKey处理方法
2014-11-24 18:57 0Oarcle中oracleHomeKey处理方法 出现O ... -
oracle创建表空间
2014-10-24 14:15 586/*分为四步 *//*第1步:创建临时表空间 */cre ... -
Oracle中针对中文进行排序
2013-09-13 09:15 853在oracle 9i之前,对中文的排序,是默认按2 ... -
Oracle over函数
2013-04-11 09:19 712sql over的作用及用法:rank ( ) over ( ... -
oracle 层次查询判断叶子和根节点
2012-12-24 16:23 4296oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,S ... -
oracle wm_concat(column)函数的使用
2012-07-06 14:05 804oracle wm_concat(column)函数使我们经常 ... -
oracle row_number() over ,rank() over ,dense_rank() over ,keep 函数比较
2012-05-08 19:54 1255create table test2 as select 1 ... -
Oracle 循环插入测试数据
2012-03-28 16:10 1657declare maxrecords consta ... -
Oracle Rownum用法详解
2012-03-27 10:30 781对于rownum来说它是oracle系统顺序分配为从查询返回的 ... -
查看oracle当前连接数
2012-03-07 09:12 819怎样查看oracle当前的连接数呢?只需要用下面的SQL语句查 ... -
oracle中的exists 和not exists 用法详解
2012-03-06 17:31 866有两个简单例子,以说明 “exists”和“in”的效率问 ... -
Oracle创建表空间、用户、导入导出命令
2012-03-05 10:46 0//创建临时表空间 create temporary tabl ... -
ORACLE递归查询
2011-03-04 14:03 1341一、建表 CREATE TABLE TB_GROUP( ...
相关推荐
删除表中产生的重复数据,并且不会损害和修改原表数据.
Oracle数据库删除表中重复记录的方法三则.txt
oracle中如何删除重复数据,方便大家下载
如何高效删除Oracle数据库中的重复数据.重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留,还能实现备份数据的持续验证
一、背景 一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录。 二、解决 ...Oracle删除重复数据的SQL(删除所有): 删除重复数据的基本结构写法: 想要删除这些
ORACLE删除重复数据
oracle数据库各种删除重复数据方法
我们可能会出现这种情况,某个表原来设计不周全,导致表...一、对于部分字段重复数据的删除 先来谈谈如何查询重复的数据吧。 下面语句能够查询出那些数据是重复的: select 字段1,字段2,count(*) from 表名 group
OracleSQL实例-删除重复数据行留最新日期实例.pdf 学习资料 复习资料 教学资源
oracle 数据库中重复的记录行的清理删除方法,总结了几种比较可行的方法路径并分析了方法的优劣
Oracle查询重复数据与删除重复记录方法,Oracle查询重复数据与删除重复记录方法
oracle删除非主键重复类型的数据,oracle删除非主键重复类型的数据
oracle中删除重复的数据,你们都用什么方法呢,我觉得很不错的去重复数据的方法,给大家分享一下
删除重复记录 删除数据表中的重复记录,包括MySQL、SQL Server、Oracle等
查询及删除重复记录的SQL语句1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断select * from 表 where Id in (select Id from 表 group by Id having count(Id) > 1)2、删除表中多余的重复记录,...
oracle删除重复记录性能分析平时收集,希望能给需要帮助的人提供便利
ORACLE删除重复数据的一种高效的方法.
Oracle查询重复数据并删除,只保留一条记录.docx
oracle删除重复数据方法。希望对大家有用。谢谢!
Oracle数据库删除重复记录的方法