2009-08-17 8 views

Respuesta

26

Ver la siguiente pregunta: Deleting duplicate rows from a table.

La respuesta aceptada adaptado a partir de allí (que es mi respuesta, por lo que no "robo" aquí ...):

Puede hacerlo de una manera simple suponiendo que tiene un campo identificador único: se puede eliminar todos los registros que son iguales excepto la ID, pero no tienen "ID mínimo" para su nombre.

Ejemplo de consulta:

DELETE FROM members 
WHERE ID NOT IN 
(
    SELECT MIN(ID) 
    FROM members 
    GROUP BY name 
) 

En caso de que no tiene un índice único, mi recomendación es simplemente agregar un índice único de auto-incrementales. Principalmente porque es un buen diseño, pero también porque le permitirá ejecutar la consulta anterior.

+1

He aquí cómo entiendo lo anterior: para cada nombre, los agrupa (solo uno si es único, varios en uno si están duplicados), selecciona el ID más pequeño del conjunto y luego elimina cualquier fila cuyo ID no exista en la tabla . Brillante :) Muchas gracias Rax. – Gulbahar

+0

Lo obtienes exactamente :) –

+1

en mysql Recibo el siguiente error al enviar esta consulta: '" error 1093 (HY000) pero da un error 'No puedes especificar los' miembros 'de la tabla de destino para actualizar en la cláusula FROM "' cualquier idea ? –

4

Probablemente sería más fácil seleccionar las únicas en una nueva tabla, soltar la tabla anterior, luego renombrar la tabla temporal para reemplazarla.

#create a table with same schema as members 
CREATE TABLE tmp (...); 

#insert the unique records 
INSERT INTO tmp SELECT * FROM members GROUP BY name; 

#swap it in 
RENAME TABLE members TO members_old, tmp TO members; 

#drop the old one 
DROP TABLE members_old; 
+0

Gracias Paul. Para aquellos interesados ​​... CREAR TABLA DE TEMPERATURA tmp_members (nombre VARCHAR); INSERT INTO tmp_members SELECT nombre DE miembros GROUP BY nombre; SELECT COUNT (nombre) FROM tmp_members; ELIMINAR DE miembros; miembros de VACUUM; SELECCIONAR CUENTA (nombre) DE miembros; INSERT INTO members (name) SELECT * FROM tmp_members; SELECCIONAR CUENTA (nombre) DE miembros; SELECCIONAR RECUENTO DISTINTO (nombre) DE miembros; SELECCIONAR nombre FROM miembros LÍMITE 10; DROP TABLE tmp_members; – Gulbahar

+0

Lo siento, ¡eché de menos que estabas usando SQLite! –

0

Tenemos una gran base de datos donde la eliminación de duplicados es parte del proceso de mantenimiento regular. Usamos DISTINCT para seleccionar los registros únicos y luego los escribimos en una TABLA TEMPORAL. Después de TRUNCATE, volvemos a escribir los datos TEMPORALES en la TABLA.

Esa es una forma de hacerlo y funciona como un PROCEDIMIENTO ALMACENADO.

+1

Tengo que admitir que la respuesta de Rax Olgud es mucho más sofisticada y probablemente se ejecute 100 veces más rápido. :) - Estoy pensando en adoptar la solución ... Merece +1! –

0

Si queremos ver primero qué filas está a punto de eliminar. Luego elimínelos.

with MYCTE as (
    SELECT DuplicateKey1 
     ,DuplicateKey2 --optional 
     ,count(*) X 
    FROM MyTable 
    group by DuplicateKey1, DuplicateKey2 
    having count(*) > 1 
) 
SELECT E.* 
FROM MyTable E 
JOIN MYCTE cte 
ON E.DuplicateKey1=cte.DuplicateKey1 
    AND E.DuplicateKey2=cte.DuplicateKey2 
ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt 

ejemplo completo en http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/

0

Eliminar fila DUP mantener una tabla tiene filas duplicadas y puede haber algunas filas no tienen filas duplicadas entonces mantener uno filas si tenga duplicado o solo en una mesa. La tabla tiene dos ID de columna y nombre si tenemos que eliminar el nombre duplicado de la tabla y mantener uno. Su trabajo está bien en mi extremo. Tiene que usar esta consulta.

DELETE FROM tablename 
WHERE id NOT IN(

SELECT id FROM 
(
    SELECT MIN(id)AS id 
    FROM tablename 
    GROUP BY name HAVING 
    COUNT(*) > 1 
)AS a) 
AND id NOT IN(
(SELECT ids FROM 
(
SELECT MIN(id)AS ids 
    FROM tablename 
    GROUP BY name HAVING 
    COUNT(*) =1 
)AS a1 
) 
) 

antes tabla de borrado está por debajo de ver la pantalla: enter image description here después del cuadro de borrado está por debajo de ver la pantalla esta consulta borrar Amit y Akhil filas duplicadas y mantener un registro (Amit y akhil):

enter image description here

0

puede unirse a la mesa con uno mismo por el campo emparejado y eliminar filas inigualables

DELETE t1 FROM table_name t1 
LEFT JOIN tablename t2 ON t1.match_field = t2.match_field 
WHERE t1.id <> t2.id; 
Cuestiones relacionadas