Question

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 base de données Oracle ?

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

Était-ce utile?

La solution

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

Autres conseils

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) quand il y a un index activé column_name.Et c'est une meilleure façon de supprimer ou de mettre à jour les lignes en double.

Le plus simple auquel je puisse penser :

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

Vous n'avez même pas besoin d'avoir le nombre 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 <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;

Dans le cas où plusieurs colonnes identifient une ligne unique (par exemple, table de relations), vous pouvez utiliser ce qui suit

Utiliser l'identifiant de ligne, par exempleEMP_DEPT (Empid, Deptid, StartDate, Enddate) Supposons que Empid et Deptid sont 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, utilisez la clé primaire au lieu de rowid, par exemple l'identifiant est pk alors

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 habituellement Analyse Oracle fonction 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).Ensuite, vous irez par ici, é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)

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 pourra peut-être aider quelqu'un.

Si vous devez imprimer d'autres colonnes du tableau tout en vérifiant les doublons, utilisez 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 ajouter 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);

Vous pouvez également essayer quelque chose comme ceci pour répertorier 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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top