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;