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

发表于:2013-8-20 10:01

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wsp971    来源:51Testing软件测试网采编

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

  大体可以分为两个方法 :一种要用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 就是定下来的了。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号