Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Excluir linhas duplicadas no SQL Server


O exemplo a seguir usa T-SQL para excluir linhas duplicadas no SQL Server.

Para ser mais específico, ele exclui linhas duplicadas, mas mantém uma. Portanto, se você tiver duas linhas idênticas, ele exclui uma delas e mantém a outra. Em outras palavras, ele desduplica a tabela.

Dados de amostra


Suponha que temos uma tabela com os seguintes dados:
SELECT * FROM Pets;

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

Podemos ver que as duas primeiras linhas são duplicadas, assim como as três últimas linhas.

Selecionar duplicatas


Antes de desduplicar a tabela, podemos usar a seguinte consulta para ver quais linhas serão excluídas:
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;

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

Excluir duplicatas


Para excluir valores duplicados, podemos modificar a consulta acima substituindo SELECT * na última linha com 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;

Resultado:
(3 rows affected)

A tabela agora foi desduplicada.

Podemos verificar isso selecionando todas as linhas novamente:
SELECT * FROM Pets;

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

Como esperado, uma das linhas duplicadas para nosso cachorro “Wag” foi excluída e a outra permanece. Duas das linhas duplicadas para “Bark” também foram excluídas. A tabela foi desduplicada com sucesso.