una tabla seleccionar sacar repetidos registros para omitir numerar mostrar encontrar duplicados datos consulta como buscar sql oracle duplicate-data

sql - tabla - omitir registros duplicados oracle



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

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

Por ejemplo: tengo una tabla de JOBS con la columna JOB_NUMBER . ¿Cómo puedo saber si tengo duplicados JOB_NUMBER s y cuántas veces se duplican?


Aquí hay una solicitud de SQL para hacer eso:

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


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 en column_name . Y es mejor manera de eliminar o actualizar filas duplicadas.


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

Use id de fila, por ejemplo, emp_dept (empid, deptid, startdate, enddate) suponga que empid y deptid son únicos e identifique 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, entonces use la clave primaria en lugar de rowid, por ejemplo, id es pk entonces

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


Lo más simple que se me ocurre:

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


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


Normalmente uso la función analítica de Oracle ROW_NUMBER() .

Digamos que desea verificar los duplicados que tiene con respecto a un índice único o clave principal construida en columnas ( c1 , c2 , c3 ). Luego irá de esta manera, haciendo aparecer ROWID de filas donde el número de líneas traídas por 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)


Obra

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 ids de las filas duplicadas.


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;


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

Si necesita imprimir otras columnas de la tabla mientras comprueba 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.


También puede probar 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;


1. solución

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


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