J'ai une table dans une base de données PostgreSQL 8.3.8, qui n'a aucune clé / contrainte dessus, et a plusieurs lignes avec exactement les mêmes valeurs.
Je souhaite supprimer tous les doublons et ne conserver qu'une seule copie de chaque ligne.
Il y a une colonne en particulier (nommée «clé») qui peut être utilisée pour identifier les doublons (c'est-à-dire qu'il ne devrait exister qu'une seule entrée pour chaque «clé» distincte).
Comment puis-je faire ceci? (idéalement avec une seule commande SQL) La vitesse n'est pas un problème dans ce cas (il n'y a que quelques lignes).
sql
postgresql
duplicates
André Morujão
la source
la source
Une solution plus rapide est
la source
ctid
?C'est rapide et concis:
Voir aussi ma réponse à Comment supprimer les lignes en double sans identifiant unique qui comprend plus d'informations.
la source
ctid
pointe vers l'emplacement physique de l'enregistrement dans la table. Contrairement à ce que j'ai écrit à l'époque dans le commentaire, l'utilisation de l'opérateur less than ne pointe pas nécessairement vers l'ancienne version car le ct peut s'enrouler et une valeur avec un ctid inférieur pourrait en fait être plus récente.min(ctid)
? alors que les vôtres gardent les plus récents? Merci!J'ai essayé ceci:
fourni par Postgres wiki:
https://wiki.postgresql.org/wiki/Deleting_duplicates
la source
id
compris.id
où colonne1 ... 3 sont en doubleJ'utiliserais une table temporaire:
Ensuite, supprimez
tab
et renommeztab_temp
entab
.la source
DROP TABLE IF EXISTS tmp; CREATE TABLE tmp as ( SELECT * from (SELECT DISTINCT * FROM your_table) as t ); DELETE from your_table; INSERT INTO your_table SELECT * from tmp; DROP TABLE tmp;
J'ai dû créer ma propre version. La version écrite par @a_horse_with_no_name est bien trop lente sur ma table (21 millions de lignes). Et @rapimo ne supprime tout simplement pas les doublages.
Voici ce que j'utilise sur PostgreSQL 9.5
la source
Une autre approche (fonctionne uniquement si vous avez un champ unique comme
id
dans votre table) pour trouver tous les identifiants uniques par colonnes et supprimer les autres identifiants qui ne sont pas dans la liste uniquela source
Que diriez-vous:
J'avais été préoccupé par l'ordre d'exécution, est-ce que le DELETE aurait lieu avant le SELECT DISTINCT, mais cela fonctionne bien pour moi. Et a l'avantage supplémentaire de ne pas avoir besoin de connaissances sur la structure de la table.
la source
json
), cela ne fonctionnera pas.Cela a bien fonctionné pour moi. J'avais une table, des termes, qui contenait des valeurs en double. Exécuté une requête pour remplir une table temporaire avec toutes les lignes en double. Ensuite, j'ai exécuté l'instruction a delete avec ces identifiants dans la table temporaire. valeur est la colonne contenant les doublons.
la source
Voici une solution utilisant
PARTITION BY
:la source