J'ai une table de base de données PostgreSQL appelée "user_links" qui autorise actuellement les champs en double suivants:
year, user_id, sid, cid
La contrainte unique est actuellement le premier champ « id », mais je suis maintenant d'ajouter une contrainte pour vous assurer que la year
, user_id
, sid
etcid
sont tous uniques , mais je ne peux pas appliquer la contrainte parce que les valeurs en double existent déjà qui violent cette contrainte.
Existe-t-il un moyen de trouver tous les doublons?
sql
postgresql
duplicates
John
la source
la source
Réponses:
L'idée de base sera d'utiliser une requête imbriquée avec une agrégation de comptage:
Vous pouvez ajuster la clause where dans la requête interne pour restreindre la recherche.
Il existe une autre bonne solution pour ce qui est mentionné dans les commentaires (mais tout le monde ne les lit pas):
Ou plus court:
la source
select co1, col2, count(*) from tbl group by col1, col2 HAVING count(*)>1
De " Rechercher les lignes en double avec PostgreSQL ", voici la solution intelligente:
la source
SELECT * FROM ( SELECT *, LEAD(row,1) OVER () AS nextrow FROM ( SELECT *, ROW_NUMBER() OVER(w) AS row FROM tbl WINDOW w AS (PARTITION BY col1, col2 ORDER BY col3) ) x ) y WHERE row > 1 OR nextrow > 1;
ROW_NUMBER()
parCOUNT(*)
et ajoutezrows between unbounded preceding and unbounded following
aprèsORDER BY id asc
DELETE ...USING
quelques ajustements mineursVous pouvez rejoindre la même table sur les champs qui seraient dupliqués puis anti-jointure sur le champ id. Sélectionnez le champ id du premier alias de table (tn1), puis utilisez la fonction array_agg sur le champ id du second alias de table. Enfin, pour que la fonction array_agg fonctionne correctement, vous regrouperez les résultats par le champ tn1.id. Cela produira un jeu de résultats contenant l'identifiant d'un enregistrement et un tableau de tous les identifiants correspondant aux conditions de jointure.
De toute évidence, les identifiants qui seront dans le tableau duplicate_entries pour un identifiant auront également leurs propres entrées dans le jeu de résultats. Vous devrez utiliser cet ensemble de résultats pour décider quel identifiant vous voulez devenir la source de la «vérité». Le seul enregistrement qui ne devrait pas être supprimé. Vous pourriez peut-être faire quelque chose comme ceci:
Sélectionne le plus petit nombre d'ID ayant des doublons (en supposant que l'ID augmente int PK). Ce seraient les pièces d'identité que vous conserveriez.
la source
Afin de faciliter les choses, je suppose que vous souhaitez appliquer une contrainte unique uniquement pour l'année de la colonne et la clé primaire est une colonne nommée id.
Afin de trouver des valeurs en double, vous devez exécuter,
En utilisant l'instruction sql ci-dessus, vous obtenez une table qui contient toutes les années en double dans votre table. Afin de supprimer tous les doublons à l'exception de la dernière entrée en double, vous devez utiliser l'instruction sql ci-dessus.
la source