點擊關註上方「SQL資料庫開發」,
需求分析
資料庫中存在重複記錄,刪除保留其中一條(是否重複判斷基準為多個欄位)
解決方案
碰到這樣的問題我們先分解步驟來看創建測試數據
找到重複的數據
刪除重複的數據並且保留一行
創建測試數據
我們創建一個人員信息表並在裡面插入一些重複的數據。
CREATE TABLE [dbo].[Person](
[ID] [INT] IDENTITY(1,1) NOT NULL,
[Name] [VARCHAR](20) NULL,
[Age] [INT] NULL,
[Address] [VARCHAR](20) NULL,
[Sex] [CHAR](2) NULL
);
SET IDENTITY_INSERT [dbo].[Person] ON;
INSERT INTO [dbo].[Person] (ID,Name,Age,Address,Sex)
VALUES
( 1, '張三', 18, '北京路18號', '男' ),
( 2, '李四', 19, '北京路29號', '男' ),
( 3, '王五', 19, '南京路11號', '女' ),
( 4, '張三', 18, '北京路18號', '男' ),
( 5, '李四', 19, '北京路29號', '男' ),
( 6, '張三', 18, '北京路18號', '男' ),
( 7, '王五', 19, '南京路11號', '女' ),
( 8, '馬六', 18, '南京路19號', '女' );
SET IDENTITY_INSERT [dbo].[Person] OFF;(提示:可以左右滑動代碼)
建立好測試數據如下:
我們發現除了自增長ID不同以為,有幾條其他欄位都重複的數據出現,符合我們的需求。
找出重複的數據
SELECT MAX(ID) ID ,
Name,Age,Address,Sex
FROM dbo.Person
GROUP BY Name,Age,Address,Sex
HAVING COUNT(1)>1HAVING將分組後統計出來的數量大於1的數據行,就是我們要找的重複數據:
上面用Max函數或者Min函數均可,只是為了保證取出來的數據的唯一性。
刪除重複的數據
其實我們資料庫中最後要保留的結果就是第二步中查詢出來的數據,我們把其他的數據刪除即可。怎麼刪除呢?我們使用ID來排除。
DELETE FROM Person
WHERE EXISTS
(
SELECT * FROM (
SELECT
MAX(ID) ID,
Name,Age,Address,Sex
FROM dbo.Person
GROUP BY Name,Age,Address,Sex
HAVING COUNT(1)>1) T
WHERE Person.Name=T.Name
AND Person.Age=T.Age
AND Person.Address=T.Address
AND Person.Sex=T.Sex
AND Person.ID<T.ID--如果上面使用MIN函數,這裡就要改成>
)執行完後重新查詢Person表結果如下:
馬六因為只有一條記錄,所以沒有參與去重,直接顯示。
今天的案例分享結束,小夥伴們可以自己動手嘗試一下,興許工作中也會遇到類似問題。如果你在公眾中遇到一些有趣的問題也可以發送給我。
最後給大家分享我寫的SQL兩件套:《SQL基礎知識第二版》和《SQL高級知識第二版》的PDF電子版。裡面有各個語法的解釋、大量的實例講解和批註等等,非常通俗易懂,方便大家跟著一起來實操。有需要的可以下載學習,只需要在下面的公眾號「數據前線」(非本號),後臺回復關鍵字:SQL,就行
數據前線