MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

2 façons de supprimer les lignes en double dans MariaDB (ignore la clé primaire)

Voici des exemples de suppression de lignes en double d'une table dans MariaDB lorsque ces lignes ont une clé primaire ou une colonne d'identifiant unique.

Les exemples suppriment les lignes en double mais en conservent une. Ainsi dans le cas de deux lignes identiques, il en supprime une et conserve l'autre.

Exemple de données

Nos exemples utilisent les données suivantes :

SELECT * FROM Dogs;

Résultat :

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

Nous pouvons voir que les deux premières lignes sont des doublons, ainsi que les trois dernières lignes.

Le DogId colonne contient des valeurs uniques (parce que c'est la clé primaire de la table), et donc, à proprement parler, il n'y a pas de doublons. Mais dans des situations réelles, vous souhaiterez souvent dédupliquer des tables contenant des clés primaires. Par conséquent, dans cet article, nous ignorons la clé primaire et nous détectons les valeurs en double dans les colonnes restantes.

Option 1

Commençons notre première option en sélectionnant toutes les lignes qui seront supprimées :

SELECT * FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

Résultat :

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

Pour supprimer ces lignes en double, nous pouvons basculer le SELECT * pour DELETE :

DELETE FROM Dogs 
WHERE DogId IN (
    SELECT DogId FROM Dogs 
    EXCEPT SELECT MIN(DogId) FROM Dogs 
    GROUP BY FirstName, LastName
    );

Résultat :

Query OK, 3 rows affected (0.017 sec)

Et pour vérifier le résultat, nous pouvons sélectionner toutes les lignes restantes dans le tableau :

SELECT * FROM Dogs;

Résultat :

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

Nous pouvons également utiliser le MAX() fonction au lieu de MIN() fonction pour changer les lignes à supprimer.

Option 2

Dans cet exemple, nous supposerons que la table a été restaurée dans son état d'origine (avec les doublons).

Nous pouvons utiliser la requête suivante pour vérifier les lignes en double :

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
);

Résultat :

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

Et nous pouvons modifier cette requête pour supprimer les doublons :

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
    )
);

Résultat :

Query OK, 3 rows affected (0.075 sec)

La table a maintenant été dédupliquée.

Nous pouvons le vérifier en sélectionnant à nouveau toutes les lignes :

SELECT * FROM Dogs;

Résultat :

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

Nous pouvons utiliser MAX() au lieu de MIN() pour supprimer les autres lignes des doublons si vous préférez.