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.