qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

删除数据库表中重复数据的总结(oracle)

 这里的重复数据指数据库中每一列的值都相同的数据,有时候也许是没有主键的原因导致数据可能重复,或者是,除了主键,其他数据重复,那么下面的方法可以都这些重复数据进行删除,保留下重复数据中的一行就可以。

  大体可以分为两个方法 :一种要用rowid来进行删除,另外一种,则是用临时表来进行删除。这里讲四种方法:

  现在假设 表test中有,三个列col1,col2,col3;在这样的表里有很多数据是重复的,现在的目标是对这些数据中重复的数据进行删除,保留下的数据都是不重复的。

  第一种方法:

  Delete from test where rowid not in(select  max(rowid) from test group by col1,col2,col3);(觉得最简单)

  第二种方法:

  Delete form test where (col1,col2,col3) in(select col1,col2,col3 from test  group bycol1,col2,col3) and rowid not in(select max(rowid) from test group by col1,col2,col3)(跟第一种差不了多少,很常见的思维方式)

  这里的删除适合删除表中有大量重复数据;

  第三种方法:

  Delete from test a where a.rowid  !=(select  max(rowid) from test b where a.col1=b.col1and a.col2=b.col2  and  a.col3=b.col3)

  变形:

  Delete from test a where a.rowid<(select  max(rowid) from test b where a.col1=b.col1 and a.col2=b.col2  and  a.col3=b.col3)

  第三种方法适合表中有少量重复数据的表

  第四种方法:(临时表法)

  Create table test2 as select distinct * from test;(建立临时表,表中存放不重复的值)

  Truncate table test;(清空原来的表)

  Insert into test  select * from test2;(重新插入不重复的值)

  当然第四种是比较麻烦的,也适合删除重复数据比较少的数据。

  关于rowid,就是指数据库表中每一行的标示吧,

  系统在你插入数据的时候要给每一行的数据分配一个rowid来进行标识每一行,从数据插入的那一刻起,rowid 就是定下来的了。

posted on 2013-08-21 10:34 顺其自然EVO 阅读(337) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2013年8月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜