Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Xóa các hàng trùng lặp trong SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách RANK () hoạt động trong SQL Server

  2. Xóa cấu hình thư cơ sở dữ liệu trong SQL Server (T-SQL)

  3. Trả về giá trị từ SQL Server Chèn lệnh sử dụng c #

  4. Cách trích xuất hoặc chuyển đổi dữ liệu thời gian từ một chuỗi trong SQL Server

  5. Sự kiện chờ SQL Server -1