Las siguientes opciones se pueden utilizar para eliminar filas duplicadas en Oracle Database.
Estos ejemplos eliminan las filas duplicadas pero conservan una. Entonces, si hay tres filas idénticas, por ejemplo, elimina dos de ellas y mantiene una. Esto a menudo se denomina eliminación de duplicados de la tabla.
Datos de muestra
Supongamos que tenemos una tabla con los siguientes datos:
SELECT * FROM Pets;
Resultado:
PETID PETNAME PETTYPE 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Podemos ver que las dos primeras filas están duplicadas, al igual que las últimas tres filas.
En este caso, todas las columnas son duplicados. No hay una columna de clave principal. Normalmente, uno podría esperar el PetId
columna como clave principal, pero contiene valores duplicados y, por lo tanto, no puede ser una clave principal.
Si fuera una clave principal, contendría valores únicos en todas las filas y no habría duplicados.
Independientemente, a continuación hay dos opciones para buscar y eliminar filas duplicadas incluso cuando no hay una clave principal.
Opción 1
Aquí hay una opción para eliminar filas duplicadas de la tabla anterior:
DELETE FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
SELECT * FROM Pets;
Resultado:
3 row(s) deleted. PETID PETNAME PETTYPE 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
La tabla ahora ha sido deduplicada. Se eliminaron tres filas y quedan cuatro.
Una de las filas duplicadas de nuestro perro "Wag" se eliminó y la otra permanece. También se han eliminado dos de las filas duplicadas para "Ladrar".
rowid
de Oracle pseudocolumn nos permitió realizar esta operación de eliminación de duplicados. Pudimos hacer referencia a él en nuestra consulta para determinar qué filas eliminar.
La forma en que esto funciona es que cada fila en una base de datos Oracle tiene un rowid
pseudocolumna que devuelve la dirección de la fila. El rowid
es un identificador único para las filas de la tabla y, por lo general, su valor identifica de forma única una fila en la base de datos. Por lo tanto, podemos identificar cada fila incluso cuando no tenemos una clave principal o algún otro campo de identificación único.
Sin embargo, es importante tener en cuenta que las filas en diferentes tablas que se almacenan juntas en el mismo clúster pueden tener el mismo rowid
.
Opción 2
Suponiendo que la tabla se haya restaurado con sus datos originales (incluidas las filas duplicadas), esta es otra opción para eliminar filas duplicadas.
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Resultado:
PETID PETNAME PETTYPE 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Mismo resultado que el ejemplo anterior.