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!

Bạn đang tìm Hosting / VPS để chạy dự án?

Hiện nay, Tinohost là một trong những nhà cung cấp Hosting tốt nhất Việt Nam. Với đội ngũ hỗ trợ nhanh chóng, giá cả phù hợp, nhiều dịch vụ miễn phí kèm theo như:

  • Hỗ trợ di chuyển dữ liệu
  • Cho dùng thử 7 ngày miễn phí
  • Tự động backup cho khách hàng (cả VPS cũng đc backup)

Sử dụng mã TINO30_2020 để được giảm 30% nhé

VÀO TINOHOST NGAY