SQL中刪除重復(fù)數(shù)據(jù)問(wèn)題
點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫(kù)開(kāi)發(fā)”,
設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨 SQL專欄 SQL基礎(chǔ)知識(shí)第二版
SQL高級(jí)知識(shí)第二版
需求分析
數(shù)據(jù)庫(kù)中存在重復(fù)記錄,刪除保留其中一條(是否重復(fù)判斷基準(zhǔn)為多個(gè)字段)
解決方案
碰到這樣的問(wèn)題我們先分解步驟來(lái)看
創(chuàng)建測(cè)試數(shù)據(jù)
找到重復(fù)的數(shù)據(jù)
刪除重復(fù)的數(shù)據(jù)并且保留一行
創(chuàng)建測(cè)試數(shù)據(jù)
我們創(chuàng)建一個(gè)人員信息表并在里面插入一些重復(fù)的數(shù)據(jù)。
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號(hào)', '男' ),
( 2, '李四', 19, '北京路29號(hào)', '男' ),
( 3, '王五', 19, '南京路11號(hào)', '女' ),
( 4, '張三', 18, '北京路18號(hào)', '男' ),
( 5, '李四', 19, '北京路29號(hào)', '男' ),
( 6, '張三', 18, '北京路18號(hào)', '男' ),
( 7, '王五', 19, '南京路11號(hào)', '女' ),
( 8, '馬六', 18, '南京路19號(hào)', '女' );
SET IDENTITY_INSERT [dbo].[Person] ?OFF;(提示:可以左右滑動(dòng)代碼)
建立好測(cè)試數(shù)據(jù)如下:

我們發(fā)現(xiàn)除了自增長(zhǎng)ID不同以為,有幾條其他字段都重復(fù)的數(shù)據(jù)出現(xiàn),符合我們的需求。
找出重復(fù)的數(shù)據(jù)
SELECT MAX(ID) ID ?,
Name,Age,Address,Sex
FROM dbo.Person
GROUP BY Name,Age,Address,Sex
HAVING COUNT(1)>1HAVING將分組后統(tǒng)計(jì)出來(lái)的數(shù)量大于1的數(shù)據(jù)行,就是我們要找的重復(fù)數(shù)據(jù):

上面用Max函數(shù)或者M(jìn)in函數(shù)均可,只是為了保證取出來(lái)的數(shù)據(jù)的唯一性。
刪除重復(fù)的數(shù)據(jù)
其實(shí)我們數(shù)據(jù)庫(kù)中最后要保留的結(jié)果就是第二步中查詢出來(lái)的數(shù)據(jù),我們把其他的數(shù)據(jù)刪除即可。怎么刪除呢?我們使用ID來(lái)排除。
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--如果上面使用MIN函數(shù),這里就要改成>
)執(zhí)行完后重新查詢Person表結(jié)果如下:

馬六因?yàn)橹挥幸粭l記錄,所以沒(méi)有參與去重,直接顯示。
今天的案例分享結(jié)束,小伙伴們可以自己動(dòng)手嘗試一下,興許工作中也會(huì)遇到類似問(wèn)題。如果你在公眾中遇到一些有趣的問(wèn)題也可以發(fā)送給我。
最后給大家分享我寫的SQL兩件套:《SQL基礎(chǔ)知識(shí)第二版》和《SQL高級(jí)知識(shí)第二版》的PDF電子版。里面有各個(gè)語(yǔ)法的解釋、大量的實(shí)例講解和批注等等,非常通俗易懂,方便大家跟著一起來(lái)實(shí)操。 有需要的可以下載學(xué)習(xí),只需要在下面的公眾號(hào)「數(shù)據(jù)前線」(非本號(hào)),后臺(tái)回復(fù)關(guān)鍵字:SQL,就行 數(shù)據(jù)前線
后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨 后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。 推薦閱讀

