当前位置: 代码迷 >> Oracle开发 >> 初学者有关问题,大量的数据中如何删除表中重复行
  详细解决方案

初学者有关问题,大量的数据中如何删除表中重复行

热度:54   发布时间:2016-04-24 06:35:57.0
菜鸟问题,大量的数据中怎么删除表中重复行?

字段1  字段2  字段3
1           a         b
2          a          b
3           a          b
------解决思路----------------------

delete from T T1
WHERE EXISTS (SELECT 1 FROM T
WHERE 字段2=T1.字段2
AND 字段3=T1.字段3
AND ROWID<T1.ROWID)

------解决思路----------------------
1、利用分析函数 ROW_NUMBER、ROWID
2、重复数据很多的话,可以导入到中间表,然后删除原表?最后RENAME,重建约束和索引
------解决思路----------------------
把不重复的行导到一张新表中,再清空原表,再导回来


注意备份。。
------解决思路----------------------
delete from test_del a where rowid !=(select max(rowid) from test_del b where a.name=b.name and a.num=b.num)

  
------解决思路----------------------
DELETE FROM temp WHERE ROWID IN (
SELECT MAX(ROWID) FROM temp
GROUP BY name,num
HAVING COUNT(*)>=2);
COMMIT;
------解决思路----------------------
引用:
delete from test_del a where rowid !=(select max(rowid) from test_del b where a.name=b.name and a.num=b.num)

  
 这个方法不错的。
------解决思路----------------------
推荐4楼。
不过感觉建中间表更快
------解决思路----------------------
4#的这种写法子查询每次都要遍历全表的,而exists 的写法找到一条就直接返回了
只能说4#这种写法比较直观容易理解,执行效率就不好说了
如果数据量不大,用哪种都可以,差别不大,大数据量的话推荐exists的写法
------解决思路----------------------
引用:
4#的这种写法子查询每次都要遍历全表的,而exists 的写法找到一条就直接返回了
只能说4#这种写法比较直观容易理解,执行效率就不好说了
如果数据量不大,用哪种都可以,差别不大,大数据量的话推荐exists的写法



我不太同意。如果只是找出,exists效率高呢。
这个感觉效率相差不是很多,这里是要删除重复行,所以要找到,然后剔除。一行找到之后并不返回,要继续往下查找下一个是否重复;有多行呢,还是要一一找出,全部剔除的。
------解决思路----------------------

delete
       from (select b.name,
             b.id,
             row_number() over(partition by b.id, b.name order by b.id) nums,
             rowid as rid
             from BAS_PRODUCTMODEL_TEST b) t
             where t.nums > 1 

把表替换下,b.id,b.name是重复依据。
------解决思路----------------------
数据量多大?几百万?还是几千万?
  相关解决方案