SQL Server 一列或多列重復數據的查詢,刪除


業務需求

最近給公司做一個小工具,把某個數據庫(數據源)的數據導進另一個數據(目標數據庫)。要求導入目標數據庫的數據不能出現重復。但情況是數據源本身就有重復的數據。所以要先清除數據源數據。

於是就把關於重復數據的查詢和處理總結一下。這里只可慮基於數據庫解決方案。不考慮程序的實現。

環境為:SQL Server 2008

基於數據庫的解決方案

數據庫測試表dbo.Member

一、單列重復

一,帶有having條件的分組查詢方法

(1)查詢某一列重復記錄

語句:

  SELECT  Name FROM  dbo.Member t WHERE Name IN (SELECT Name FROM dbo.Member GROUP BY Name HAVING COUNT(Name)>1 ) ORDER BY t.Name

查詢結果:

(2)查詢某一列不重復的記錄

語句:

SELECT * FROM dbo.Member WHERE ID  IN (SELECT MIN(ID) FROM dbo.Member GROUP BY Name)

查詢結果:

(3)清除某一列重復的數據

語句:

 DELETE FROM dbo.Member WHERE ID NOT IN (SELECT MIN(ID) FROM dbo.Member GROUP BY Name)

執行結果:

解釋:上面的例子只保存了各自Name的最小值。

二,DISTINCT 的用法
溫馨提醒:
不支持多列統計
Oracle和DB2數據庫也適用

利用distinct關鍵字返回唯一不同的值

(1)查詢某一列不重復數據

語句:

  SELECT DISTINCT Name FROM dbo.Member

結果集:

(2)DISTINCT 查詢多列不重復(如果查詢的列有任何一個不重復,則這條記錄視為不重復)

語句:

SELECT DISTINCT Name,Uid FROM dbo.Member
查詢結果


DISTINCT 用於統計

語句
 SELECT COUNT(DISTINCT(Name)) FROM dbo.Member

 二、多列重復

 

數據表結構

查找Original_ID和Match_ID這兩列值重復的行

SQL語句

SELECT m.* FROM dbo.Match m,(
SELECT Original_ID,Match_ID
FROM dbo.Match 
GROUP BY Original_ID,Match_ID
HAVING COUNT(1)>1

) AS m1
WHERE m.Original_ID=m1.Original_ID AND m.Match_ID=m1.Match_ID

 

查詢結果

 




免責聲明!

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



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