Supprimer les lignes en double d'un petit tableau avec des colonnes uniques
Dans les bases de données PostgreSQL, l'élimination des lignes en double peut améliorer l'intégrité des données et optimiser les performances. Supposons que vous ayez une table contenant des lignes sans contrainte et des données en double, en particulier dans une colonne spécifique appelée « clé ». L'objectif est de supprimer les doublons et de conserver une seule instance de chaque valeur « clé » unique.
Solution de commande SQL unique
Pour ce faire avec une seule commande SQL, vous pouvez suivre les étapes suivantes :
1. Identifiez la première occurrence répétée : Tout d’abord, nous devons identifier la première occurrence de chaque ligne répétée. Ces informations sont essentielles pour conserver une seule copie des données.
<code class="language-sql">SELECT MIN(ctid) AS ctid, key FROM dups GROUP BY key HAVING COUNT(*) > 1;</code>
2. Supprimer la non-première occurrence : Une fois la première occurrence identifiée, nous pouvons supprimer tous les doublons suivants en fonction de leur valeur « ctid ». La colonne "ctid" représente l'emplacement physique de la ligne dans le tableau.
<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>
Considérez la commande en ligne
Bien que cette méthode supprime efficacement les doublons, elle ne garantit pas quelle ligne est conservée en cas d'occurrences multiples. S'il existe des critères spécifiques pour sélectionner les lignes à conserver, ils doivent être incorporés dans la requête.
Exemple :
Pour une meilleure compréhension, considérons l'exemple suivant :
<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); -- 显示重复项的第一次出现: SELECT MIN(ctid) AS ctid, name, surname FROM people GROUP BY (name, surname) HAVING COUNT(*) > 1; -- 删除重复项的非第一次出现: 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; SELECT * FROM people;</code>
Cet exemple de tableau contient des données personnelles potentiellement en double. Après l'exécution de la deuxième requête, les doublons sont supprimés et seuls les prénoms et noms uniques restent dans la table.
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!