309 votes

Comment trouver les valeurs dupliquées dans une table dans Oracle ?

Quelle est l'instruction SQL la plus simple qui renvoie les valeurs dupliquées pour une colonne donnée et le nombre de leurs occurrences dans une table de la base de données Oracle ?

Par exemple : J'ai un JOBS avec la colonne JOB_NUMBER . Comment puis-je savoir si j'ai des doublons ? JOB_NUMBER et combien de fois ils sont dupliqués ?

1 votes

685voto

Bill the Lizard Points 147311

Agrégez la colonne par COUNT, puis utilisez une clause HAVING pour trouver les valeurs qui apparaissent plus d'une fois.

SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;

1 votes

Merci - c'est la réponse que je viens de trouver et tu m'as devancé pour la poster ici ! :o)

3 votes

Vous êtes les bienvenus. Je suis sur le point de poster ma propre question sur les différences entre count(column) et count(*). :)

53 votes

+1 plus de 4 ans plus tard, fonctionne toujours bien, et peut être ajusté pour sélectionner plusieurs colonnes tant que celles-ci se trouvent également dans le fichier group by comme dans : select column_one, column_two, count(*) from tablename group by column_one, column_two having count(column_one) > 1; etc.

64voto

Grrey Points 186

Une autre façon :

SELECT *
FROM TABLE A
WHERE EXISTS (
  SELECT 1 FROM TABLE
  WHERE COLUMN_NAME = A.COLUMN_NAME
  AND ROWID < A.ROWID
)

Fonctionne bien (assez rapidement) lorsqu'il y a un index en cours. column_name . Et c'est un meilleur moyen de supprimer ou de mettre à jour les lignes en double.

3 votes

+1 fonctionne bien pour les doublons multi-colonnes (par exemple lorsque vous voulez ajouter une contrainte UNIQUE sur plusieurs colonnes), j'ai trouvé cette approche moins "rigide" que celle du GROUP BY pour lister les valeurs des champs doublés + d'autres champs si nécessaire.

3 votes

Pour clarifier, (ce n'était pas évident pour moi au début) cette requête renvoie uniquement les doublons, elle ne renvoie pas la première entrée originale, c'est pourquoi elle fonctionne bien pour supprimer les doublons, sur la base d'une contrainte unique sur plus d'une colonne. Vous pouvez sélectionner les ID des doublons avec cette requête, puis les utiliser pour supprimer les doublons.

1 votes

Si vous remplacez < par !=, vous obtiendrez tous les enregistrements en double, et pas seulement le 2ème ou le 3ème enregistrement.

36voto

JosephStyons Points 21187

Le plus simple auquel je puisse penser :

select job_number, count(*)
from jobs
group by job_number
having count(*) > 1;

1 votes

Comment puis-je obtenir toutes les colonnes ?

2 votes

Select * from jobs where job_number in(select job_number from jobs group by job_number having count(*) > 1)

0 votes

La solution la plus aimée... plutôt se souvenir... J'aime toujours copier... merci @jo

17voto

Evan Points 9261

Vous n'avez même pas besoin d'avoir le compte dans les colonnes retournées si vous n'avez pas besoin de connaître le nombre réel de doublons, par exemple.

SELECT column_name
FROM table
GROUP BY column_name
HAVING COUNT(*) > 1

7voto

Andrew Points 4523

Pourquoi pas :

SELECT <column>, count(*)
FROM <table>
GROUP BY <column> HAVING COUNT(*) > 1;

Pour répondre à l'exemple ci-dessus, cela ressemblerait à ceci :

SELECT job_number, count(*)
FROM jobs
GROUP BY job_number HAVING COUNT(*) > 1;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X