今天公司編輯部有一妹紙,遇到問題,是需要處理資料庫中重覆的數據,於是想辦法幫忙解決,要求刪除重覆的數據,該表中只有一個欄位,假設為保存的公司名,這是經過多重過濾之後,最終留下的的數據,需要進行篩選,然後重覆的數據只保留一條,最上邊或最下邊的都可以,有且僅有一條,整張表的數據量大概在20W左右,重覆量 ...
今天公司編輯部有一妹紙,遇到問題,是需要處理資料庫中重覆的數據,於是想辦法幫忙解決,要求刪除重覆的數據,該表中只有一個欄位,假設為保存的公司名,這是經過多重過濾之後,最終留下的的數據,需要進行篩選,然後重覆的數據只保留一條,最上邊或最下邊的都可以,有且僅有一條,整張表的數據量大概在20W左右,重覆量多少不清楚,可能很多,可能很少,廢話話不多說,開始解決問題,第一次寫博客,不會排版。
首先,如圖所示,這裡是我假定的數據,
從圖中可以看到,CompanyName表中只有一個名為CName的欄位,裡邊有一些值,模擬處理的數據,可以看到,裡邊有一些重覆的數據,這些就是我們將要處理的數據,處理之後應該是這樣,對應的SQL語句是
````SELECT distinct [CName]
FROM [CreamBlog].[dbo].[CompanyName]
where CName in (select CName from CompanyName group by CName having COUNT(CName)>1)
首先我們需要篩選出重覆的數據,不重覆的就不需要管,然後列出重覆的數據,把上邊查詢中的distinct去掉,就可以找到所有重覆的數據,在後邊一句count(CName)>1這裡進行重覆數據的篩選
經過對比我們可以發現,上圖中的機器人公司是只有一條數據,因此這樣就已經經過一次過濾,然後就是重覆數據的處理,我們假設要把最頂上的信息刪除,如果信息量多,我們比較容易實現,但是現在只有一個欄位,那麼應該如何考慮,在這裡有一個小技巧(個人認為),首先可以在CompanyName的表中新增加一列,這裡設置欄位名為Num(名字隨便起),然後在標識規範中進行設置為自增為1的欄位
然後保存,結果應該是這樣
緊接著,我們用這個Num欄位來進行再一次的過濾,先用之前的方法過濾出來重覆的,然後再把Num欄位中大的值給查詢出來,然後Num小的值留下,當然,也可以把裡邊的Min改為Max,這樣就是把Num小的值查詢出來,把Num大的值留下,如圖
,附上SQL語句
```SELECT [CName],Num
FROM [CreamBlog].[dbo].[CompanyName]
where CName in (select CName from CompanyName group by CName having COUNT(CName)>1)
and Num not in (select Min(Num) from CompanyName group by CName having COUNT(CName)>1),這樣其實已經把所有的重覆的值找了出來,並且把我們想要保留的保存了下來,接著進行刪除操作,首先我們進行查詢,我們最終的結果是什麼樣子,如圖
換成查詢數量,也就是說我們要查出這個數量,就是正確的,這個就是處理結束之後,最終我們想要的結果,這裡是全部處理完之後把多餘的刪除了,重覆數據只保留一條的結果
Select COUNT(*) as count from ( SELECT distinct [CName] FROM [CreamBlog].[dbo].[CompanyName] where CName in (select CName from CompanyName group by CName )) as t1,對於我模擬的數據,最終是6條
delete FROM [CreamBlog].[dbo].[CompanyName]
where CName in (select CName from CompanyName group by CName having COUNT(CName)>1)
and Num not in (select Min(Num) from CompanyName group by CName having COUNT(CName)>1),到此為止,整個重覆處理過程就完工了。
總結一下,首先是分組排序,然後找出重覆的,過濾掉單個數據,緊接著過濾掉多個重覆的數據,留下多餘的數據,接著刪除數據。
PS:友情提醒,刪除數據屬於危險行為,刪除前請謹慎操作,先查詢出來,看看是不是自己要刪除的數據,再進行操作,另外,最好留一個備份。