Je teste quelque chose dans Oracle et remplit une table avec des exemples de données, mais dans le processus, j'ai accidentellement chargé des enregistrements en double, donc maintenant je ne peux pas créer de clé primaire en utilisant certaines des colonnes.
Comment puis-je supprimer toutes les lignes en double et n'en laisser qu'une seule?
De Ask Tom
(correction de la parenthèse manquante)
la source
Depuis DevX.com :
Où colonne1, colonne2, etc. est la clé que vous souhaitez utiliser.
la source
la source
Solution 1)
Solution 2)
Solution 3)
la source
créer la table t2 comme select distinct * de t1;
la source
distinct *
prendra chaque enregistrement qui diffère d'au moins 1 symbole dans 1 colonne. Tout ce dont vous avez besoin est de sélectionner des valeurs distinctes uniquement à partir des colonnes pour lesquelles vous souhaitez créer des clés primaires - la réponse de Bill est un excellent exemple de cette approche.Vous devriez faire un petit bloc pl / sql en utilisant un curseur pour la boucle et supprimer les lignes que vous ne voulez pas conserver. Par exemple:
la source
Pour sélectionner les doublons, seul le format de requête peut être:
Ainsi, la requête correcte selon une autre suggestion est:
Cette requête conservera l'enregistrement le plus ancien de la base de données pour les critères choisis dans le
WHERE CLAUSE
.Associé certifié Oracle (2008)
la source
Le moyen le plus rapide pour les très grandes tables
Créez une table d'exceptions avec la structure ci-dessous: exceptions_table
Essayez de créer une contrainte unique ou une clé primaire qui sera violée par les doublons. Vous recevrez un message d'erreur car vous avez des doublons. La table des exceptions contiendra les rowids des lignes dupliquées.
Rejoignez votre table avec exceptions_table par rowid et supprimez les dups
Si le nombre de lignes à supprimer est important, créez une nouvelle table (avec toutes les subventions et tous les index) anti-jointure avec exceptions_table par rowid et renommez la table d'origine en table original_dups et renommez new_table_with_no_dups en table d'origine
la source
Utilisation de rowid-
Utilisation de l'auto-jointure
la source
Solution 4)
la source
1. solution
2. sloution
3. solution
4. solution
la source
5. solution
la source
et vous pouvez également supprimer les enregistrements en double d'une autre manière
la source
la source
la source
la source
Pour de meilleures performances, voici ce que j'ai écrit:
(voir plan d'exécution)
la source
Vérifiez ci-dessous les scripts -
1.
2.
3.
Vous verrez ici 6 disques.
4. exécuter la requête ci-dessous -
select * from test;
Vous verrez que les enregistrements en double ont été supprimés.
J'espère que cela résout votre requête. Merci :)
la source
Je n'ai vu aucune réponse utilisant des expressions de table et des fonctions de fenêtre courantes. C'est ce avec quoi je trouve le plus facile de travailler.
Quelque chose à noter:
1) Nous vérifions uniquement la duplication sur les champs de la clause de partition.
2) Si vous avez une raison de choisir un doublon par rapport aux autres, vous pouvez utiliser une clause order by pour que cette ligne ait row_number () = 1
3) Vous pouvez modifier le numéro en double conservé en modifiant la clause where finale en "Where RN> N" avec N> = 1 (je pensais que N = 0 supprimerait toutes les lignes qui ont des doublons, mais cela supprimerait simplement toutes les lignes) .
4) Ajout du champ de partition Sum à la requête CTE qui marquera chaque ligne avec le nombre de lignes dans le groupe. Donc, pour sélectionner des lignes avec des doublons, y compris le premier élément, utilisez "WHERE cnt> 1".
la source
la source
Solution :
la source