Maison >base de données >tutoriel mysql >Comment supprimer efficacement les lignes en double d'une table en SQL ?

Comment supprimer efficacement les lignes en double d'une table en SQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-19 02:47:08164parcourir

How to Efficiently Delete Duplicate Rows from a Table in SQL?

SQL : élimination des lignes en double dans les tableaux

Défi :

Vous êtes confronté à une table dépourvue de clés primaires ou de contraintes, contenant plusieurs lignes avec des données identiques. L'objectif est de supprimer les lignes en double, en ne préservant qu'une seule instance de chaque ligne unique. Nous utiliserons une colonne nommée « clé » pour identifier les doublons, en garantissant qu'une seule entrée existe pour chaque valeur « clé » distincte.

Solution :

Ce processus comporte deux étapes clés :

  1. Identification de la première occurrence : Localisez l'instance initiale de chaque ligne en double.
  2. Suppression des doublons suivants : Supprimez toutes les lignes qui ne constituent pas la première occurrence identifiée à l'étape 1.

La commande SQL suivante accomplit cela :

<code class="language-sql">DELETE FROM dups a USING (
    SELECT MIN(ctid) as ctid, key
    FROM dups 
    GROUP BY key HAVING COUNT(*) > 1
) b
WHERE a.key = b.key 
AND a.ctid <> b.ctid;</code>

Remarque importante : Cette méthode n'offre pas de contrôle sur la ligne spécifique qui est conservée.

Exemple illustratif :

Considérez cet exemple de tableau :

<code class="language-sql">CREATE TABLE people (
    name    varchar(50) NOT NULL,
    surname varchar(50) NOT NULL,
    age     integer NOT NULL
);

INSERT INTO people (name, surname, age) VALUES 
    ('A.', 'Tom', 30),
    ('A.', 'Tom', 10),
    ('B.', 'Tom', 20),
    ('B', 'Chris', 20);</code>

Pour rechercher la première occurrence de doublons :

<code class="language-sql">SELECT MIN(ctid) as ctid, name, surname
FROM people 
GROUP BY (name, surname) HAVING COUNT(*) > 1;</code>

Sortie :

ctid name surname
(0,1) A. Tom

Suppression des autres doublons :

<code class="language-sql">DELETE FROM people a USING (
    SELECT MIN(ctid) as ctid, name, surname
    FROM people 
    GROUP BY (name, surname) HAVING COUNT(*) > 1
) b
WHERE a.name = b.name
AND a.surname = b.surname
AND a.ctid <> b.ctid;</code>

Les lignes restantes :

<code class="language-sql">SELECT * FROM people;</code>

Sortie :

name surname age
A. Tom 30
B. Tom 20
B Chris 20

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn