码迷,mamicode.com
首页 > 数据库 > 详细

PL/SQL删除重复记录

时间:2015-09-10 17:51:34      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:pl/sql删除重复记录

--数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……

  方法一


declare @max integer,@id integer
 declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
 open cur_rows
 fetch cur_rows into @id,@max
 while @@fetch_status=0
 begin
 select @max = @max -1
 set rowcount @max
 delete from 表名 where 主字段 = @id
 fetch cur_rows into @id,@max
 end
 close cur_rows
 set rowcount 0

  方法二

   有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

   1、对于第一种重复,比较容易解决,使用


select distinct * from tableName

  就可以得到无重复记录的结果集。

   如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除


select distinct * into #Tmp from tableName
 drop table tableName
 select * into tableName from #Tmp
 drop table #Tmp

  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

   2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

   假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集


select identity(int,1,1) as autoID, * into #Tmp from tableName
 select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,Address
 select * from #Tmp where autoID in(select autoID from #tmp2)


  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

     在导入到原数据表之前,我们需要将删除新添加的autoID字段列,保证数据表之间字段结构的一致.

     再创建一个中间表Tmp3,将上面最后一部获得的不重复的结果集导入到Tmp3之中.


 
select * into #Tmp3 from #Tmp where autoID in (select autoID from #Tmp where autoID in(select autoID from #tmp2))

 

      这样,Tmp3中保存的记录集合就是我们所希望得到的不重复的结果集.但由于Tmp3中存在autoID字段,所以我们先删除Tmp3表中该列。

 



Alter TableName Drop Column autoID

 

接着我们采取第一种重复的解决方法,将Tmp3中的记录集合导入到我们所需要导入的数据表之中.



select distinct * into #Tmp3 from tableName
drop table tableName
select * into tableName from #Tmp3
drop table #Tmp3
drop table #Tmp2
drop table #Tmp

 

     通过以上步骤,tableName中就是我们想要得到的结果集,不存在重复的记录


本文出自 “孤单” 博客,转载请与作者联系!

PL/SQL删除重复记录

标签:pl/sql删除重复记录

原文地址:http://weijun1235.blog.51cto.com/5083880/1693336

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!