2017年9月26日 星期二

[SQL Server] 刪除重複資料的方法

如果遇條件或索引鍵不夠嚴謹資料表,再加上使用者習慣不好的話
難免會有重複資料的產生,遇到這種情況
即使想要清除重複資料,常常也會連動到舊有的資料
造成維護起來相當麻煩的狀況

但其實只要利用一些技巧,還是可以刪除這些不必要的重複資料


ex
TableA
 水果  價格 
 1   香蕉    15
 2  蘋果   20
 3  香蕉   15
 4  蘋果   20

由上表可以看出表中 香蕉,蘋果 都重複了一筆資料
在主索引鍵沒有的情況下,再加上表中只有兩個欄位 '水果'和'價格'
資料辨識能力實在不高

首先先想辦法增加能夠協助我們辨識資料的欄位
這邊我們利用 ROW_NUMBER 函數
將 Select 的結果加上流水號

語法:
ROW_NUMBER() Over(Order by 欄位)

Select *, ROW_NUMBER() Over(Order by 水果) As '流水號' From TableA

結果
 水果  價格  流水號
 1   香蕉    15     1
 2  香蕉   15     2
 3  蘋果   20     3
 4  蘋果   20     4

接下來篩選出我們要的資料    

這邊語法分段寫比較容易讀懂
承上
StrTempA = Select *, ROW_NUMBER() Over(Order by 水果) As '流水號' From TableA

Select * From ( StrTempA ) A Where 流水號 In (Select Max(流水號) From ( StrTempA ) A Group By 水果)

結果
 水果  價格  流水號
 1   香蕉    15     2
 2  蘋果   20     4

這就能夠篩選出不重複水果名稱的資料

而刪除的話,只要把不符合以上條件資料砍掉就可以了
所以條件反過來篩選

Delete A From ( StrTempA ) A Where A.流水號 Not In (Select Max(流水號) From ( StrTempA ) A Group By 水果)

如此一來流水號為 1,3 這兩筆重複資料就會刪除了

沒有留言:

張貼留言