Estoy probando algo en Oracle y llené una tabla con algunos datos de muestra, pero en el proceso cargué accidentalmente registros duplicados, por lo que ahora no puedo crear una clave principal con algunas de las columnas.
¿Cómo puedo eliminar todas las filas duplicadas y dejar solo una de ellas?
sql
oracle
duplicates
delete-row
juan
fuente
fuente
De Ask Tom
(arreglado el paréntesis faltante)
fuente
De DevX.com :
Donde column1, column2, etc. es la clave que desea usar.
fuente
fuente
Solución 1)
Solución 2)
Solución 3)
fuente
crear la tabla t2 como seleccionar distinto * de t1;
fuente
distinct *
tomará todos los registros que difieran en al menos 1 símbolo en 1 columna. Todo lo que necesita es seleccionar valores distintos solo de las columnas que desea que sean claves principales: la respuesta de Bill es un gran ejemplo de este enfoque.Debe hacer un pequeño bloque pl / sql con un cursor para bucle y eliminar las filas que no desea conservar. Por ejemplo:
fuente
Para seleccionar los duplicados, solo el formato de consulta puede ser:
Entonces, la consulta correcta según otra sugerencia es:
Esta consulta mantendrá el registro más antiguo en la base de datos para los criterios elegidos en el
WHERE CLAUSE
.Asociado certificado de Oracle (2008)
fuente
La forma más rápida para mesas realmente grandes
Cree una tabla de excepciones con la estructura a continuación: excepciones_tabla
Intente crear una restricción única o clave principal que será violada por los duplicados. Recibirá un mensaje de error porque tiene duplicados. La tabla de excepciones contendrá los rowids para las filas duplicadas.
Únase a su tabla con exceptions_table por rowid y elimine dups
Si la cantidad de filas para eliminar es grande, cree una nueva tabla (con todas las concesiones e índices) anti-unión con exceptions_table by rowid y cambie el nombre de la tabla original a la tabla original_dups y cambie el nombre de new_table_with_no_dups a la tabla original
fuente
Usando rowid-
Usando auto unirse
fuente
Solución 4)
fuente
1. solución
2. sloution
3.solución
4. solución
fuente
5. solución
fuente
y también puedes eliminar registros duplicados de otra manera
fuente
fuente
fuente
fuente
Para un mejor rendimiento, esto es lo que escribí:
(ver plan de ejecución)
fuente
Verifique los guiones a continuación:
1)
2)
3)
Verá aquí 6 registros.
4.ejecutar debajo de la consulta -
select * from test;
Verá que se han eliminado registros duplicados.
Espero que esto resuelva tu consulta. Gracias :)
fuente
No vi ninguna respuesta que use expresiones de tabla comunes y funciones de ventana. Esto es con lo que me resulta más fácil trabajar.
Algo a tener en cuenta:
1) Solo estamos verificando la duplicación en los campos de la cláusula de partición.
2) Si tiene alguna razón para elegir un duplicado sobre otros, puede usar una orden por cláusula para hacer que esa fila tenga row_number () = 1
3) Puede cambiar el número duplicado conservado cambiando la cláusula where final a "Where RN> N" con N> = 1 (estaba pensando que N = 0 eliminaría todas las filas que tienen duplicados, pero simplemente eliminaría todas las filas) .
4) Se agregó el campo Suma partición a la consulta CTE que etiquetará cada fila con las filas de números en el grupo. Entonces, para seleccionar filas con duplicados, incluido el primer elemento, use "WHERE cnt> 1".
fuente
fuente
solución:
fuente