1.利用rowid
在oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的(rowid确定了每条记录是oracle中的哪一个数据文件、块、行上)。在重复的记录中,可能所有列的内容都相同,但rowid不会相同。SQL语句如下:
DELETE FROM EMPLOYEE
WHERE ROWID IN (SELECT A.ROWID
FROM EMPLOYEE A, EMPLOYEE B
WHERE A.ROWID < B.ROWID
AND A.NAME = B.NAME);
如果已经知道每条记录只有一条重复的,这个sql语句适用。但是如果每条记录的重复记录有N条,这个N是未知的,就要考虑适用下面这种方法了。
2.结合rowid利用max/min函数
DELETE FROM EMPLOYEE A
WHERE ROWID NOT IN
(SELECT MAX(B.ROWID) FROM EMPLOYEE B WHERE A.NAME = B.NAME);
这里也可以使用min或者用下面的语句
DELETE FROM EMPLOYEE A
WHERE ROWID < (SELECT MAX(B.ROWID) FROM EMPLOYEE B WHERE A.NAME = B.NAME);
这里如果把max换成min的话,前面的where子句中需要把<改为>
3.利用group by
跟上面的方法思路基本是一样的,不过使用group by减少显性的比较条件,提高效率。
DELETE FROM EMPLOYEE
WHERE ROWID NOT IN (SELECT MAX(ROWID) FROM EMPLOYEE T GROUP BY T.NAME);
或者
DELETE FROM EMPLOYEE
WHERE NAME IN
(SELECT NAME FROM EMPLOYEE GROUP BY NAME HAVING COUNT(*) > 1)
AND ROWID NOT IN
(SELECT MIN(ROWID) FROM EMPLOYEE GROUP BY NAME HAVING COUNT(*) > 1);
4.利用分析函数
SELECT *
FROM EMPLOYEE
WHERE ROWID IN (SELECT RID
FROM (SELECT ROWID RID,
ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY ROWID) N
FROM EMPLOYEE)
WHERE N <> 1);
注:如果重复的是多个字段(利用group by)
DELETE FROM EMPLOYEE
WHERE (NAME, SEX) IN (SELECT NAME, SEX
FROM EMPLOYEE
GROUP BY NAME, SEX
HAVING COUNT(*) > 1)
AND ROWID NOT IN (SELECT MIN(ROWID)
FROM EMPLOYEE
GROUP BY NAME, SEX
HAVING COUNT(*) > 1);
随便说一下,以上语句的执行效率是很低的,可以考虑建立临时表,将需要判断重复的字段、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);
最后一点,对于完全重复记录的删除,可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:
CREATE TABLE 临时表 AS(SELECT DISTINCT * FROM 表名);
TRUNCATE TABLE 正式表;
INSERT INTO 正式表 (SELECT * FROM 临时表);
DROP TABLE 临时表;
相关推荐
删除表中产生的重复数据,并且不会损害和修改原表数据.
Oracle数据库删除表中重复记录的方法三则.txt
oracle中如何删除重复数据,方便大家下载
如何高效删除Oracle数据库中的重复数据.重复数据删除技术可以提供更大的备份容量,实现更长时间的数据保留,还能实现备份数据的持续验证
ORACLE删除重复数据
Oracle查询重复数据与删除重复记录方法,Oracle查询重复数据与删除重复记录方法
我们可能会出现这种情况,某个表原来设计不周全,导致表...一、对于部分字段重复数据的删除 先来谈谈如何查询重复的数据吧。 下面语句能够查询出那些数据是重复的: select 字段1,字段2,count(*) from 表名 group
oracle数据库各种删除重复数据方法
OracleSQL实例-删除重复数据行留最新日期实例.pdf 学习资料 复习资料 教学资源
oracle中删除重复的数据,你们都用什么方法呢,我觉得很不错的去重复数据的方法,给大家分享一下
经典oracle查重语句 oracle查询重复数据方法
删除重复记录的方法原理:在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。在重复的记录中,可能所有列的内容都相同,但rowid不会...
使用ORACLE去除重复数据,这在日常数据处理中非常有用。
删除重复记录 删除数据表中的重复记录,包括MySQL、SQL Server、Oracle等
可以查询表中的重复数据。一条sql语句。
oracle 数据库中重复的记录行的清理删除方法,总结了几种比较可行的方法路径并分析了方法的优劣
oracle删除非主键重复类型的数据,oracle删除非主键重复类型的数据
一、背景 一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录。 二、解决 ...Oracle删除重复数据的SQL(删除所有): 删除重复数据的基本结构写法: 想要删除这些
ORACLE删除重复数据的一种高效的方法.
oracle删除重复记录性能分析平时收集,希望能给需要帮助的人提供便利