Ví dụ sau sử dụng T-SQL để xóa các hàng trùng lặp trong SQL Server.
Cụ thể hơn, nó xóa các hàng trùng lặp nhưng giữ lại một hàng. Vì vậy, nếu bạn có hai hàng giống nhau, nó sẽ xóa một trong số chúng và giữ lại hàng kia. Nói cách khác, nó khử trùng bảng.
Dữ liệu mẫu
Giả sử chúng ta có một bảng với dữ liệu sau:
SELECT * FROM Pets;
Kết quả:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | | 4 | Bark | Dog | | 4 | Bark | Dog | +---------+-----------+-----------+
Chúng ta có thể thấy rằng hai hàng đầu tiên là trùng lặp, ba hàng cuối cùng cũng vậy.
Chọn bản sao
Trước khi xóa dữ liệu bảng, chúng ta có thể sử dụng truy vấn sau để xem hàng / s nào sẽ bị xóa:
WITH CTE AS
(
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets
)
SELECT * FROM CTE WHERE Row_Number <> 1;
Kết quả:
+---------+-----------+-----------+--------------+ | PetId | PetName | PetType | Row_Number | |---------+-----------+-----------+--------------| | 1 | Wag | Dog | 2 | | 4 | Bark | Dog | 2 | | 4 | Bark | Dog | 3 | +---------+-----------+-----------+--------------+
Xóa các bản sao
Để xóa các giá trị trùng lặp, chúng tôi có thể sửa đổi truy vấn trên bằng cách thay thế SELECT *
trên dòng cuối cùng có DELETE
:
WITH CTE AS
(
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets
)
DELETE FROM CTE WHERE Row_Number <> 1;
Kết quả:
(3 rows affected)
Bảng hiện đã được gỡ bỏ.
Chúng tôi có thể xác minh điều này bằng cách chọn lại tất cả các hàng:
SELECT * FROM Pets;
Kết quả:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | +---------+-----------+-----------+
Như mong đợi, một trong những hàng trùng lặp cho chú chó “Wag” của chúng tôi đã bị xóa và hàng còn lại vẫn còn. Hai trong số các hàng trùng lặp cho “Bark” cũng đã bị xóa. Bảng đã được loại bỏ thành công.