刪除重複資料的三種sql寫法

iSQlServer發表於2009-12-07
 
問題:一個表有自增的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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-621848/,如需轉載,請註明出處,否則將追究法律責任。

相關文章