SQL删除重复数据总结

 
SQL删除重复数据(总结)
 
一、具有主键的情况
 
I.具有唯一性的字段id(为唯一主键)
 
delete 用户表    
where id not in    
select max(id) from 用户表 group by col1,col2,col3... 
group by 子句后跟的字段就是你用来判断重复的条件,如只有col1, 
那么只要col1字段内容相同即表示记录相同。 
 
II.具有联合主键
 
假设col1+','+col2+','...col5 为联合主键
 
(找出相同记录)
select * from     用户表 where col1+','+col2+','...col5 in 
 select max(col1+','+col2+','...col5) from 用户表    
 group by col1,col2,col3,col4
 having count(*)>1     
group by 子句后跟的字段就是你用来判断重复的条件, 
如只有col1,那么只要col1字段内容相同即表示记录相同。 
 
或者:
(找出相同记录)
select * from 用户表     where exists (select 1 from 用户表 x where 用户表.col1 = x.col1 and    
用户表.col2= x.col2 group by x.col1,x.col2 having count(*) >1) 
 
III:判断所有的字段
 
   select * into #aa from 用户表 group by id1,id2,.... 
   delete 用户表    
   insert into 用户表 select * from #aa 
 
二、没有主键的情况 
 
I.用临时表实现 
 
select identity(int,1,1) as id,* into #temp from 用户表 
delete #temp    
where id not in    
   select max(id) from # group by col1,col2,col3... 
delete 用户表 ta 
inset into ta(...) select ..... from #temp 
 
II.用改变表结构(加一个唯一字段)来实现
 
alter 用户表 add     newfield int identity(1,1) 
delete 用户表 
where newfield not in 
select min(newfield) from 用户表 group by 除newfield外的所有字段 
alter 用户表 drop column newfield
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>