¿Cómo encuentro valores duplicados en una tabla en Oracle?


277

¿Cuál es la instrucción SQL más simple que devolverá los valores duplicados para una columna dada y el recuento de sus ocurrencias en una tabla de base de datos Oracle?

Por ejemplo: tengo una JOBStabla con la columna JOB_NUMBER. ¿Cómo puedo saber si tengo duplicados JOB_NUMBERy cuántas veces están duplicados?


Respuestas:


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

1
Gracias, ¡esa es la respuesta que acabo de encontrar y me ganas de publicarlo aquí! : o)
Andrew

3
De nada. Ahora estoy a punto de publicar mi propia pregunta sobre las diferencias entre cuenta (columna) y cuenta (*). :)
Bill the Lizard

44
+1 más de 4 años después, todavía funciona bien, y se puede ajustar para seleccionar varias columnas siempre que también estén en group by, como en: select column_one, column_two, count(*) from tablename group by column_one, column_two having count(column_one) > 1;etc.
Amos M. Carpenter

44
o incluso having count(*) > 1: D
Stanislav Mamontov

3
+1 más de 8 años después, todavía funciona bien para las dos últimas versiones de Oracle y MySQL (elimine el espacio después de la función de conteo en la línea).
PhatHV

58

De otra manera:

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

Funciona bien (lo suficientemente rápido) cuando hay un índice activado column_name. Y es una mejor manera de eliminar o actualizar filas duplicadas.


3
+1 funciona bien para duplicados de múltiples columnas (por ejemplo, cuando desea agregar una restricción ÚNICA en varias columnas), encontré este enfoque menos "rígido" que el GROUP BY para enumerar los valores de campo duplicados + otros campos si es necesario.
Frosty Z

3
Solo para aclarar, (esto no era obvio para mí al principio) esta consulta solo devuelve los duplicados, no devuelve la primera entrada original, por lo que funciona bien para eliminar los duplicados, en función de una restricción única en más de 1 columna Puede seleccionar los ID duplicados con esta consulta y luego usarlos para eliminar los duplicados.
matthewb

1
si cambia <a! = obtendrá todos los registros que se duplican. no solo el segundo o tercer registro
moore1emu

33

Más simple que se me ocurre:

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

1
¿Cómo puedo obtener todas las columnas?
Asif Mushtaq

2
seleccione * de los trabajos donde se encuentra el número de trabajo (seleccione el número de trabajo del grupo de trabajos por número de trabajo que cuenta (*)> 1)
JosephStyons

17

Ni siquiera necesita tener el recuento en las columnas devueltas si no necesita saber el número real de duplicados. p.ej

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

7

Qué tal si:

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

Para responder al ejemplo anterior, se vería así:

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

5

En caso de que varias columnas identifiquen una fila única (por ejemplo, tabla de relaciones), puede usar lo siguiente

Utilice la identificación de la fila, por ejemplo, emp_dept (empid, deptid, startdate, enddate) suponga que empid y deptid son únicos e identifiquen la fila en ese caso

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);

y si dicha tabla tiene una clave primaria, use la clave primaria en lugar de rowid, por ejemplo, id es pk y luego

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);

4

Haciendo

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

le dará los identificadores de las filas duplicadas.


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

2

Usualmente uso la función Oracle Analytic ROW_NUMBER () .

Digamos que usted quiere comprobar los duplicados que tienen con respecto a un índice único o una clave principal construida sobre columnas ( c1, c2, c3). Luego irá de esta manera, mostrando ROWIDs de filas donde el número de líneas traídas ROW_NUMBER()es >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)

1

Aquí hay una solicitud SQL para hacer eso:

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

1

Sé que es un hilo viejo pero esto puede ayudar a alguien.

Si necesita imprimir otras columnas de la tabla mientras verifica el uso duplicado a continuación:

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;

También puede agregar algunos filtros adicionales en la cláusula where si es necesario.


0

1. solución

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

Este póster original nunca mencionó eliminar, solo contar
Jeff

-1

También puede intentar algo como esto para enumerar todos los valores duplicados en una tabla, por ejemplo, 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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.