sql - sur - Comment puis-je trouver des valeurs dupliquées dans une table dans Oracle?




supprimer doublons sql (8)

Quelle est l'instruction SQL la plus simple qui renvoie les valeurs en double pour une colonne donnée et le nombre de leurs occurrences dans une table de base de données 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 ont été dupliqués?


Aussi, vous pouvez essayer quelque chose comme ceci pour lister toutes les valeurs en double dans une table dire 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;

Autrement:

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

Fonctionne bien (assez rapide) quand il y a index sur column_name . Et il est préférable de supprimer ou de mettre à jour les lignes en double.


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.


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

Dites que vous voulez vérifier les doublons que vous avez concernant un index unique ou une clé primaire construite sur des colonnes ( c1 , c2 , c3 ). Ensuite, vous passerez de cette façon, en élevant ROWID s de lignes où le nombre de lignes apportées 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)

Que diriez-vous:

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

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

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

Voici une requête SQL pour le faire:

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

1. solution

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

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




duplicate-data