sql >> Databáze >  >> RDS >> Sqlserver

Odstraňte duplicitní řádky na serveru SQL Server

Následující příklad používá T-SQL k odstranění duplicitních řádků v SQL Server.

Přesněji řečeno, odstraní duplicitní řádky, ale jeden ponechá. Pokud tedy máte dva stejné řádky, jeden z nich smaže a druhý ponechá. Jinými slovy, de-duplikuje tabulku.

Ukázková data

Předpokládejme, že máme tabulku s následujícími údaji:

SELECT * FROM Pets;

Výsledek:

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

Vidíme, že první dva řádky jsou duplikáty, stejně jako poslední tři řádky.

Vyberte Duplikáty

Před odstraněním duplicit v tabulce můžeme použít následující dotaz, abychom zjistili, které řádky budou odstraněny:

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;

Výsledek:

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

Smazat duplikáty

Chcete-li odstranit duplicitní hodnoty, můžeme upravit výše uvedený dotaz nahrazením SELECT * na posledním řádku s 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;

Výsledek:

(3 rows affected)

Tabulka byla nyní deduplikována.

Můžeme to ověřit tak, že znovu vybereme všechny řádky:

SELECT * FROM Pets;

Výsledek:

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

Podle očekávání byl jeden z duplicitních řádků pro našeho psa „Wag“ smazán a druhý zůstává. Dva z duplicitních řádků pro „Kůra“ byly také odstraněny. Tabulka byla úspěšně deduplikována.


  1. Jak odstranit prvních 1000 řádků z tabulky pomocí SQL Server 2008?

  2. Příčiny chyby MySQL 2014 Nelze provádět dotazy, když jsou aktivní jiné dotazy bez vyrovnávací paměti

  3. Jak STR_TO_DATE() funguje v MariaDB

  4. Vytvoření uživatele PostgreSQL a jeho přidání do databáze