業務需求
最近給公司做一個小工具,把某個數據庫(數據源)的數據導進另一個數據(目標數據庫)。要求導入目標數據庫的數據不能出現重復。但情況是數據源本身就有重復的數據。所以要先清除數據源數據。
於是就把關於重復數據的查詢和處理總結一下。這里只可慮基於數據庫解決方案。不考慮程序的實現。
環境為: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
查詢結果
