MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

2 maneiras de excluir linhas duplicadas no MariaDB (ignora a chave primária)


Aqui estão exemplos de remoção de linhas duplicadas de uma tabela no MariaDB quando essas linhas têm uma chave primária ou uma coluna de identificador exclusivo.

Os exemplos excluem linhas duplicadas, mas mantêm uma. Portanto, no caso de duas linhas idênticas, ele exclui uma delas e mantém a outra.

Dados de amostra


Nossos exemplos usam os seguintes dados:
SELECT * FROM Dogs;

Resultado:
+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     1 | Bark      | Smith    |
|     2 | Bark      | Smith    |
|     3 | Woof      | Jones    |
|     4 | Ruff      | Robinson |
|     5 | Wag       | Johnson  |
|     6 | Wag       | Johnson  |
|     7 | Wag       | Johnson  |
+-------+-----------+----------+

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

O DogId A coluna contém valores únicos (porque é a chave primária da tabela) e, portanto, estritamente falando, não há duplicatas. Mas em situações da vida real, muitas vezes você desejará desduplicar tabelas que contêm chaves primárias. Portanto, neste artigo, ignoramos a chave primária e detectamos valores duplicados nas colunas restantes.

Opção 1


Vamos iniciar nossa primeira opção selecionando todas as linhas que serão excluídas:
SELECT * FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

Resultado:
+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     2 | Bark      | Smith    |
|     6 | Wag       | Johnson  |
|     7 | Wag       | Johnson  |
+-------+-----------+----------+

Para remover essas linhas duplicadas, podemos alternar o SELECT * para DELETE :
DELETE FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

Resultado:
Query OK, 3 rows affected (0.017 sec)

E para verificar o resultado, podemos selecionar todas as linhas restantes da tabela:
SELECT * FROM Dogs;

Resultado:
+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     1 | Bark      | Smith    |
|     3 | Woof      | Jones    |
|     4 | Ruff      | Robinson |
|     5 | Wag       | Johnson  |
+-------+-----------+----------+

Podemos usar alternativamente o MAX() função em vez de MIN() função para alterar quais linhas são excluídas.

Opção 2


Neste exemplo, vamos supor que a tabela foi restaurada ao seu estado original (com as duplicatas).

Podemos usar a seguinte consulta para verificar se há linhas duplicadas:
SELECT * 
FROM Dogs d1, Dogs d2 
WHERE d1.FirstName = d2.FirstName 
AND d1.LastName = d2.LastName
AND d1.DogId <> d2.DogId 
AND d1.DogId = (
    SELECT MAX(DogId) 
    FROM Dogs d3 
    WHERE d3.FirstName = d1.FirstName 
    AND d3.LastName = d1.LastName
);

Resultado:
+-------+-----------+----------+-------+-----------+----------+
| DogId | FirstName | LastName | DogId | FirstName | LastName |
+-------+-----------+----------+-------+-----------+----------+
|     2 | Bark      | Smith    |     1 | Bark      | Smith    |
|     7 | Wag       | Johnson  |     5 | Wag       | Johnson  |
|     7 | Wag       | Johnson  |     6 | Wag       | Johnson  |
+-------+-----------+----------+-------+-----------+----------+

E podemos modificar essa consulta para excluir as duplicatas:
DELETE FROM Dogs WHERE DogId IN (
    SELECT d2.DogId 
    FROM Dogs d1, Dogs d2 
    WHERE d1.FirstName = d2.FirstName 
    AND d1.LastName = d2.LastName 
    AND d1.DogId <> d2.DogId 
    AND d1.DogId=( 
        SELECT MIN(DogId) 
        FROM Dogs d3 
        WHERE d3.FirstName = d1.FirstName 
        AND d3.LastName = d1.LastName
    )
);

Resultado:
Query OK, 3 rows affected (0.075 sec)

A tabela agora foi desduplicada.

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

Resultado:
+-------+-----------+----------+
| DogId | FirstName | LastName |
+-------+-----------+----------+
|     1 | Bark      | Smith    |
|     3 | Woof      | Jones    |
|     4 | Ruff      | Robinson |
|     5 | Wag       | Johnson  |
+-------+-----------+----------+

Podemos usar MAX() em vez de MIN() para excluir as outras linhas das duplicatas, se preferir.