Eliminar filas duplicadas de una tabla
-
20-08-2019 - |
Pregunta
Tengo una tabla en mi base de datos que tiene registros duplicados que quiero eliminar. No quiero crear una nueva tabla con entradas distintas para esto. Lo que quiero es eliminar entradas duplicadas de la tabla existente sin la creación de ninguna tabla nueva. ¿Hay alguna forma de hacer esto?
id action
L1_name L1_data
L2_name L2_data
L3_name L3_data
L4_name L4_data
L5_name L5_data
L6_name L6_data
L7_name L7_data
L8_name L8_data
L9_name L9_data
L10_name L10_data
L11_name L11_data
L12_name L12_data
L13_name L13_data
L14_name L14_data
L15_name L15_data
mira estos todos son mis campos:
id es único para cada fila.
L11_data es único para el campo de acción respectivo.
L11_data tiene nombres de compañías mientras que action tiene nombres de industrias.
Entonces, en mis datos, tengo un nombre duplicado de las empresas en L11_data para sus respectivas industrias.
Lo que quiero es tener un nombre único y otros datos de las compañías en la industria particular almacenados en acción. Espero haber expresado mi problema de manera que ustedes puedan entenderlo.
Solución
Sí, suponiendo que tenga un campo de ID único, puede eliminar todos los registros que sean iguales, excepto la ID, pero que no tienen " la ID mínima " por su grupo de valores.
Consulta de ejemplo:
DELETE FROM Table
WHERE ID NOT IN
(
SELECT MIN(ID)
FROM Table
GROUP BY Field1, Field2, Field3, ...
)
Notas:
- Elegí libremente "Mesa" y '' ID '' como nombres representativos
- La lista de campos (" Campo1, Campo2, ... ") debe incluir todos los campos excepto el ID
- Esta puede ser una consulta lenta dependiendo del número de campos y filas, sin embargo, espero que esté bien en comparación con las alternativas
EDITAR: en caso de que no tenga un índice único, mi recomendación es simplemente agregar un índice único auto-incremental. Principalmente porque es un buen diseño, pero también porque le permitirá ejecutar la consulta anterior.
Otros consejos
ALTER IGNORE TABLE 'table' ADD UNIQUE INDEX(your cols);
Los duplicados se vuelven NULOS, luego puedes eliminarlos
DELETE
FROM table_x a
WHERE rowid < ANY (
SELECT rowid
FROM table_x b
WHERE a.someField = b.someField
AND a.someOtherField = b.someOtherField
)
WHERE (
a.someField,
a.someOtherField
) IN (
SELECT c.someField,
c.someOtherField
FROM table_x c
GROUP BY c.someField,
c.someOtherField
HAVING count(*) > 1
)
En la consulta anterior, la combinación de someField y someOtherField debe identificar los duplicados de manera distintiva.