最近由于要给旧系统的表中增加主键(SQL Server2000的表),由于旧表中存在重复记录所以导致增加不上,所以需要写一段SQL语句来删除所有的重复记录(就是必须保留重复记录中的一条,维持数据记录的唯一性),我知道园子里大虾多,所以在这里集思广益,看看大家都有什么好的办法:

方法一:
     1
为了保证完整性,首先启动一个事务

2 声明一个表变量(在这里使用表变量主要是考虑重复的数据不是很多,同时为了获得更好的性能;当然如果重复的数据特别多,使用临时表是更

好的选择,因为表变量的数据都是存在内存中的,如果数据量大,可能导致内存吃紧。)用于存储重复性的数据,这个需要定义成和源表一样。

       3 将重复记录的一条插入到表变量中。

       4 删除所有有重复记录的记录

       5 将表变量中的记录插入的源表中。

       6 如果出错,回滚事务,否则提交事务

以下是相应的sql语句块:
1删除表中重复记录--转自博客园(LazyBee)_icoBegin Tran LazyBee
2删除表中重复记录--转自博客园(LazyBee)_icodeclare @tmp Table
3删除表中重复记录--转自博客园(LazyBee)_ico(lLIstHeader_id int,lEncounter_id int,dtLastUpdate_dt datetime,
4删除表中重复记录--转自博客园(LazyBee)_ico sLastUpdate_id char(10),iConcurrency_id int)
5删除表中重复记录--转自博客园(LazyBee)_ico
6删除表中重复记录--转自博客园(LazyBee)_icoInsert @tmp(lLIstHeader_id,lEncounter_id,dtLastUpdate_dt,sLastUpdate_id,iConcurrency_id)
7删除表中重复记录--转自博客园(LazyBee)_icoselect lListHeader_id,lEncounter_id,dtLastUpdate_dt,sLastUpdate_id,iConcurrency_id  
8删除表中重复记录--转自博客园(LazyBee)_icofrom lstHeaderencounter
9删除表中重复记录--转自博客园(LazyBee)_icogroup by lListHeader_id,lEncounter_id,dtLastUpdate_dt,sLastUpdate_id,iConcurrency_id
10删除表中重复记录--转自博客园(LazyBee)_icohaving count(*)>1
11删除表中重复记录--转自博客园(LazyBee)_ico
12删除表中重复记录--转自博客园(LazyBee)_icodelete lstHeaderencounter from @tmp d
13删除表中重复记录--转自博客园(LazyBee)_icowhere d.lListHeader_id=lstHeaderencounter.lListHeader_id and
14删除表中重复记录--转自博客园(LazyBee)_ico       d.lEncounter_id=lstHeaderencounter.lEncounter_id
15删除表中重复记录--转自博客园(LazyBee)_ico
16删除表中重复记录--转自博客园(LazyBee)_icoinsert lstHeaderencounter(lLIstHeader_id,lEncounter_id,dtLastUpdate_dt,sLastUpdate_id,iConcurrency_id)
17删除表中重复记录--转自博客园(LazyBee)_icoselect lListHeader_id,lEncounter_id,dtLastUpdate_dt,sLastUpdate_id,iConcurrency_id
18删除表中重复记录--转自博客园(LazyBee)_icofrom @tmp
19删除表中重复记录--转自博客园(LazyBee)_ico
20删除表中重复记录--转自博客园(LazyBee)_icoif @@error<>0
21删除表中重复记录--转自博客园(LazyBee)_icoBegin
22删除表中重复记录--转自博客园(LazyBee)_ico     print roll back
23删除表中重复记录--转自博客园(LazyBee)_ico     RollBack Tran LazyBee
24删除表中重复记录--转自博客园(LazyBee)_ico  End
25删除表中重复记录--转自博客园(LazyBee)_icoelse
26删除表中重复记录--转自博客园(LazyBee)_icoBegin
27删除表中重复记录--转自博客园(LazyBee)_ico   print Success
28删除表中重复记录--转自博客园(LazyBee)_ico     Commit Tran LazyBee
29删除表中重复记录--转自博客园(LazyBee)_ico  End
30删除表中重复记录--转自博客园(LazyBee)_ico

我知道这个方法不够通用,因为如果有多个类似重复记录的表存在,将每次都要修改表定义和插入语句的字段内容,不知各位有没有好的方法或意见,大家讨论讨论:)

刚在网上找到另外一些解决方案,感觉也挺不错的

方法二:

       1 创建一个临时表,这个临时表的结构和源表一样

       2 给这个临时表增加一个唯一索引(根据需要),并且选中忽略重复值

       3 将源表的记录全部插入临时表中,这时会因为重复记录出现3604的错误。

       4 删除源表的记录,将临时表的记录插入源表中,然后删除临时表。

方法三(主要针对重复记录完全相同的情况):

       1 利用distinct将唯一记录插入临时表中

                2 然后将唯一记录再倒回源表中
删除表中重复记录--转自博客园(LazyBee)_icoSelect distinct * into #Tmp from tableName
删除表中重复记录--转自博客园(LazyBee)_ico
Drop table tableName
删除表中重复记录--转自博客园(LazyBee)_ico
Select * into tableName from #Tmp
删除表中重复记录--转自博客园(LazyBee)_ico
Drop table #Tmp
删除表中重复记录--转自博客园(LazyBee)_ico
  

方法四(主要针对记录部分字段相同的记录):

       这种方法和方法一有点类似,不过实现方法不同而已。在这里使用了两个临时表.我们假设重复字段为lListHeader_id,lEncounter_id,要求得到这两

个字段的唯一结果集,我们保留重复记录的第一条,当然如果保留重复记录的最后一条可以使用max代替min
      
删除表中重复记录--转自博客园(LazyBee)_icoSelect identity(int,1,1) as autoID, * into #Tmp from tableName
删除表中重复记录--转自博客园(LazyBee)_ico
Select min(autoID) as autoID into #Tmp2 from #Tmp group by lListHeader_id,lEncounter_id
删除表中重复记录--转自博客园(LazyBee)_ico
Select * from #Tmp where autoID in (Select autoID from #Tmp2)