Comment trouver des valeurs en double dans une table dans Oracle?

Quelle est l’instruction SQL la plus simple qui renverra les valeurs en double pour une colonne donnée et le nombre de leurs occurrences dans une table de firebase database Oracle?

Par exemple: j’ai une table 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?

 select column_name, count(column_name) from table group by column_name having count (column_name) > 1; 

Autrement:

 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 sur column_name . Et c'est mieux pour supprimer ou mettre à jour des lignes en double.

Plus simple je peux penser à:

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

Vous n’avez même pas besoin d’avoir le compte dans les colonnes renvoyé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 

Que diriez-vous:

 SELECT , count(*) FROM  GROUP BY  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; 

Si plusieurs colonnes identifient une ligne unique (par exemple, une table de relations), vous pouvez utiliser les suivantes:

Utilisez un identifiant de ligne, par exemple emp_dept (empid, deptid, startdate, enddate), supposons que empid et deptid soient uniques et identifient la ligne dans ce cas

 select oed.empid, count(oed.empid) from emp_dept oed where exists ( select * from emp_dept ied where oed.rowid <> ied.rowid and ied.empid = oed.empid and ied.deptid = oed.deptid ) group by oed.empid having count(oed.empid) > 1 order by count(oed.empid); 

et si une telle table a une clé primaire, alors utilisez la clé primaire au lieu de rowid, par exemple l’id est alors pk

 select oed.empid, count(oed.empid) from emp_dept oed where exists ( select * from emp_dept ied where oed.id <> ied.id and ied.empid = oed.empid and ied.deptid = oed.deptid ) group by oed.empid having count(oed.empid) > 1 order by count(oed.empid); 

Faire

 select count(j1.job_number), j1.job_number, j1.id, j2.id from jobs j1 join jobs j2 on (j1.job_numer = j2.job_number) where j1.id != j2.id group by j1.job_number 

vous donnera les identifiants des lignes dupliquées.

 SELECT SocialSecurity_Number, Count(*) no_of_rows FROM SocialSecurity GROUP BY SocialSecurity_Number HAVING Count(*) > 1 Order by Count(*) desc 

J’utilise généralement la fonction Oracle Analytic ROW_NUMBER () .

Supposons que vous souhaitiez vérifier les doublons que vous avez concernant un index unique ou une clé primaire construite sur des colonnes ( c1 , c2 , c3 ). Vous allez ensuite procéder de cette façon, en mettant en ROWID les ROWID des lignes où le nombre de lignes apscopes par ROW_NUMBER() est >1 :

 Select * From Table_With_Duplicates Where Rowid In (Select Rowid From (Select Rowid, ROW_NUMBER() Over ( Partition By c1 || c2 || c3 Order By c1 || c2 || c3 ) nbLines From Table_With_Duplicates) t2 Where nbLines > 1) 

Voici une requête SQL pour faire cela:

 select column_name, count(1) from table group by column_name having count (column_name) > 1; 

Je sais que c’est un vieux fil mais cela peut aider quelqu’un.

Si vous avez besoin d’imprimer d’autres colonnes de la table tout en vérifiant l’utilisation des doublons ci-dessous:

 select * from table where column_name in (select ing.column_name from table ing group by ing.column_name having count(*) > 1) order by column_name desc; 

peut également append des filtres supplémentaires dans la clause where si nécessaire.

1. solution

 select * from emp where rowid not in (select max(rowid) from emp group by empno); 

Aussi, vous pouvez essayer quelque chose comme ça pour lister toutes les valeurs en double dans un tableau, par exemple reqitem

 SELECT count(poid) FROM poitem WHERE poid = 50 AND rownum < any (SELECT count(*) FROM poitem WHERE poid = 50) GROUP BY poid MINUS SELECT count(poid) FROM poitem WHERE poid in (50) GROUP BY poid HAVING count(poid) > 1;