sql >> Base de Datos >  >> RDS >> Oracle

2 formas de eliminar filas duplicadas en Oracle

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.