Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Usuń zduplikowane wiersze w SQL Server

Poniższy przykład używa T-SQL do usuwania zduplikowanych wierszy w SQL Server.

Mówiąc dokładniej, usuwa zduplikowane wiersze, ale zachowuje jeden. Więc jeśli masz dwa identyczne wiersze, usuwa jeden z nich i zachowuje drugi. Innymi słowy, usuwa duplikat tabeli.

Przykładowe dane

Załóżmy, że mamy tabelę z następującymi danymi:

SELECT * FROM Pets;

Wynik:

+---------+-----------+-----------+
| PetId   | PetName   | PetType   |
|---------+-----------+-----------|
| 1       | Wag       | Dog       |
| 1       | Wag       | Dog       |
| 2       | Scratch   | Cat       |
| 3       | Tweet     | Bird      |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
+---------+-----------+-----------+

Widzimy, że pierwsze dwa wiersze są duplikatami, podobnie jak ostatnie trzy wiersze.

Wybierz duplikaty

Zanim usuniemy duplikat tabeli, możemy użyć następującego zapytania, aby zobaczyć, które wiersze zostaną usunięte:

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;

Wynik:

+---------+-----------+-----------+--------------+
| PetId   | PetName   | PetType   | Row_Number   |
|---------+-----------+-----------+--------------|
| 1       | Wag       | Dog       | 2            |
| 4       | Bark      | Dog       | 2            |
| 4       | Bark      | Dog       | 3            |
+---------+-----------+-----------+--------------+

Usuń duplikaty

Aby usunąć zduplikowane wartości, możemy zmodyfikować powyższe zapytanie, zastępując SELECT * w ostatniej linii z 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;

Wynik:

(3 rows affected)

Tabela została usunięta z kopii.

Możemy to zweryfikować, wybierając ponownie wszystkie wiersze:

SELECT * FROM Pets;

Wynik:

+---------+-----------+-----------+
| PetId   | PetName   | PetType   |
|---------+-----------+-----------|
| 1       | Wag       | Dog       |
| 2       | Scratch   | Cat       |
| 3       | Tweet     | Bird      |
| 4       | Bark      | Dog       |
+---------+-----------+-----------+

Zgodnie z oczekiwaniami, jeden ze zduplikowanych wierszy dla naszego psa „Wag” został usunięty, a drugi pozostał. Usunięto również dwa zduplikowane wiersze dla „Kora”. Tabela została pomyślnie zdeduplikowana.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Standardowe ciągi formatu liczbowego obsługiwane przez FORMAT() w SQL Server

  2. 4 sposoby sprawdzania zduplikowanych wierszy w SQL Server

  3. Tworzenie złożonego klucza podstawowego w SQL Server

  4. Czy mogę używać wielu kursorów na jednym połączeniu z pyodbc i MS SQL Server?

  5. Funkcja w SQL Server 2008 podobna do GREATEST w mysql?