现在的位置: 首页 > 综合 > 正文

删除重复数据的三种sql写法

2012年08月03日 ⁄ 综合 ⁄ 共 638字 ⁄ 字号 评论关闭

问题:一个表有自增的ID列,表中有一些记录内容重复,也就是说这些记录除了ID不同之外,其他的信息都相同。需要把重复的记录保留一条,剩下的删除
 
方法一:还是2000年的时候一位Oracle DBA叫罗敏发给技术部全体的(可惜原始邮件找不到了,要不然我当文物发给大家):
delete from temp
where id not in (
 select min(id) 
 from temp
 group by column1,column2,...,columnn)
 个人感觉这个方法思路比较清晰。不过效率相对来说不高。
 
方法二:赵贲在网络上搜出来的:
 --删除相同城市下的相同行政区
 delete a from area a where a.id>(select min(id) from area b where a.area_id=b.area_id and a.city_id=b.city_id)
 
方法三:使用sql 2005新增的row_number()功能和with关键字,我是从赵立东那里学来的。
 
print('删除PriceInfo表中重复的记录')
;WITH a AS (
 SELECT ROW_NUMBER()OVER (PARTITION BY hotel_id,room_type_id,start_date,end_date
 ORDER BY hotel_id,room_type_id,start_date,end_date) AS rn ,* 
 FROM hotel_price
 )
delete from a WHERE a.rn>1

抱歉!评论已关闭.