SQLServer數據庫中處理重復數據


今天公司編輯部有一妹紙,遇到問題,是需要處理數據庫中重復的數據,於是想辦法幫忙解決,要求刪除重復的數據,該表中只有一個字段,假設為保存的公司名,這是經過多重過濾之后,最終留下的的數據,需要進行篩選,然后重復的數據只保留一條,最上邊或最下邊的都可以,有且僅有一條,整張表的數據量大概在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語句

  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),這樣其實已經把所有的重復的值找了出來,並且把我們想要保留的保存了下來,接着進行刪除操作,首先我們進行查詢,我們最終的結果是什么樣子,如圖

![](http://images2015.cnblogs.com/blog/922259/201701/922259-20170118234212078-125160252.png)
換成查詢數量,也就是說我們要查出這個數量,就是正確的,這個就是處理結束之后,最終我們想要的結果,這里是全部處理完之后把多余的刪除了,重復數據只保留一條的結果
```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:友情提醒,刪除數據屬於危險行為,刪除前請謹慎操作,先查詢出來,看看是不是自己要刪除的數據,再進行操作,另外,最好留一個備份。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM