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
Libérer: 2025-01-19 02:47:08
original
162 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

Les lignes restantes :

<code class="language-sql">SELECT * FROM people;</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal