Xác định và xóa các bản ghi trùng lặp trong bảng SQL Server

Trùng lặp dữ liệu là 1 vấn đề thường gặp đối với ai hay làm việc với CSDL còn cái việc mà đi dọn dẹp cho đống dữ liệu đó thì ôi thôi, mệt vãi chưởng. Xác định được dữ liệu bị lặp trong hàng nghìn, hàng triệu dòng thì vất vả vãi chưa kể nếu xóa nhầm thì có mà đi toi cả lũ. Mình cũng dặn các bạn là nên backup lại dữ liệu thật kĩ rồi mới tiến hành nhé, mình cũng vài lần cho đi DB của hệ thống nhưng may là cũng phục hồi được chứ không giờ ngồi nhà đá viết bài chứ chẳng chơi J

Còn trong bài này mình xin nêu 3 cách để thực hiện cách xóa các dữ liệu bị trùng lặp ở trong bảng.

Đầu tiên ta tạo ra ít dữ liệu giả nhỉ :3

USE [AdventureWorks]

GO

 

SELECT TOP 100 ContactID, FirstName, LastName, EmailAddress, Phone

INTO DummyData

FROM Person.Contact

 

SELECT * FROM DummyData

 

INSERT INTO DummyData

SELECT TOP 40 PERCENT FirstName, LastName, EmailAddress, Phone

from DummyData

 

SELECT * FROM DummyData

 

INSERT INTO DummyData

SELECT TOP 30 PERCENT FirstName, LastName, EmailAddress, Phone

from DummyData

 

SELECT * FROM DummyData

 

 

Cách 1: sử dụng row_number

;WITH dup as (

SELECT ContactID, FirstName, LastName, EmailAddress, Phone,

ROW_NUMBER() OVER(PARTITION BY FirstName, LastName ORDER BY ContactID) AS NumOfDups

FROM DummyData)

SELECT * FROM dup

WHERE NumOfDups > 1

ORDER BY ContactID

— Remove/Delete duplicate records:

;WITH dup as (

SELECT ContactID, FirstName, LastName, EmailAddress, Phone,

ROW_NUMBER() OVER(PARTITION BY FirstName, LastName ORDER BY ContactID) AS NumOfDups

FROM DummyData)

DELETE FROM dup

WHERE NumOfDups > 1

SELECT * FROM DummyData

 

 

 

Cách 2: sử dụng join

SELECT DISTINCT a.ContactID, a.FirstName, a.LastName, a.EmailAddress, a.Phone

FROM DummyData a

JOIN DummyData b

ON a.FirstName = b.FirstName

AND a.LastName = b.LastName

AND a.ContactID > b.ContactID

DELETE a

FROM DummyData a

JOIN DummyData b

ON a.FirstName = b.FirstName

AND a.LastName = b.LastName

AND a.ContactID > b.ContactID

 

SELECT * FROM DummyData

 

Cách 3: Sử dụng subquery

SELECT * FROM DummyData

WHERE ContactID NOT IN (SELECT MIN(ContactID)

FROM DummyData

GROUP BY FirstName, LastName)

 

— Remove/Delete duplicate records:

DELETE FROM DummyData

WHERE ContactID NOT IN (SELECT MIN(ContactID)

FROM DummyData

GROUP BY FirstName, LastName)

 

SELECT * FROM DummyData

Đặc biệt lưu ý là backup dữ liệu trước khi thực hiện nhé. Đặc biệt lưu ý phát nữa :3

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s