Xóa dữ liệu trùng nhau trong SQL Server

Trong bài này mình sẽ hướng dẫn các bạn cách xóa dữ liệu trùng nhau trong SQL Server. Đây là trường hợp khá phổ biến khi bạn vô tình nhập dữ liệu trùng nhau quá nhiều và muốn xóa chúng ra khỏi table.

Để xóa duplicate dữ liệu thì ta thực hiện ba bước như sau:

  • Tìm các dòng trùng nhau bằng GROUP BY và ROW_NUMBER().
  • Sử dụng lệnh Delete để xóa các row trùng.

Ok, ta sẽ thực hành thông qua một ví dụ cụ thể luôn nhé.

1. Tạo dữ liệu mẫu trùng nhau

Hãy tạo một table bằng câu lệnh SQL sau:

DROP TABLE IF EXISTS sales.contacts;

CREATE TABLE sales.contacts(
    contact_id INT IDENTITY(1,1) PRIMARY KEY,
    first_name NVARCHAR(100) NOT NULL,
    last_name NVARCHAR(100) NOT NULL,
    email NVARCHAR(255) NOT NULL,
);

Tiếp đến hãy insert vào dòng dữ liệu, trong đó có dữ liệu trùng nhau nhé.

INSERT INTO sales.contacts
    (first_name,last_name,email) 
VALUES
    ('Syed','Abbas','syed.abbas@example.com'),
    ('Catherine','Abel','catherine.abel@example.com'),
    ('Kim','Abercrombie','kim.abercrombie@example.com'),
    ('Kim','Abercrombie','kim.abercrombie@example.com'),
    ('Kim','Abercrombie','kim.abercrombie@example.com'),
    ('Hazem','Abolrous','hazem.abolrous@example.com'),
    ('Hazem','Abolrous','hazem.abolrous@example.com'),
    ('Humberto','Acevedo','humberto.acevedo@example.com'),
    ('Humberto','Acevedo','humberto.acevedo@example.com'),
    ('Pilar','Ackerman','pilar.ackerman@example.com');

Bây giờ hãy sử dụng lệnh Select để xem tổng thể của table vừa tạo đó.

SELECT 
   contact_id, 
   first_name, 
   last_name, 
   email
FROM 
   sales.contacts;

Kết quả sẽ như hình dưới đây.

SQL Server Delete Duplicates png

Có ba cặp dữ liệu trùng đó là: (3,4,5), (6,7), và (8,9).

2. Xóa dữ liệu trùng nhau từ bảng đã tạo

Trong lệnh này có sử dụng common table expression (CTE), nếu bạn chưa biết nó là gì thì có thể tra google để xem thêm nhé.

WITH cte AS (
    SELECT 
        contact_id, 
        first_name, 
        last_name, 
        email, 
        ROW_NUMBER() OVER (
            PARTITION BY 
                first_name, 
                last_name, 
                email
            ORDER BY 
                first_name, 
                last_name, 
                email
        ) row_num
     FROM 
        sales.contacts
)
DELETE FROM cte
WHERE row_num > 1;

Chạy câu lệnh này và xem lại trong table thì bạn sẽ thấy các row trùng nhau đã bị xóa.

SQL Server Delete Duplicate Rows Result png

Như vậy, với câu lệnh đơn giản trên là bạn có thể xóa dữ liệu trùng nhau trong SQL Server rồi đấy. Bạn có thể thay đổi tên field và table cho giống với table hiện tại của bạn. Chúc thành công!

Ngẫu nhiên