Si encuentras algún detalle que te causa duda puedes dejarlo en la sección de comentarios y trataremos de ayudarte rápidamente.
Solución:
Puede hacer esto con las funciones de ventana. Ordenará los duplicados por empId y eliminará todos menos el primero.
delete x from (
select *, rn=row_number() over (partition by EmployeeName order by empId)
from Employee
) x
where rn > 1;
Ejecútelo como una selección para ver qué se eliminaría:
select *
from (
select *, rn=row_number() over (partition by EmployeeName order by empId)
from Employee
) x
where rn > 1;
Suponiendo que su tabla de empleados también tiene una columna única (ID
en el ejemplo a continuación), lo siguiente funcionará:
delete from Employee
where ID not in
(
select min(ID)
from Employee
group by EmployeeName
);
Esto dejará la versión con el ID más bajo en la tabla.
Editar
Comentario de Re McGyver – a partir de SQL 2012
MIN
se puede usar con columnas numéricas, char, varchar, identificador único o de fecha y hora, pero no con columnas de bits
Para 2008 R2 y anteriores,
MIN se puede usar con columnas numéricas, char, varchar o de fecha y hora, pero no con columnas de bits (y tampoco funciona con GUID)
Para 2008R2 necesitarás lanzar el GUID
a un tipo soportado por MIN
p.ej
delete from GuidEmployees
where CAST(ID AS binary(16)) not in
(
select min(CAST(ID AS binary(16)))
from GuidEmployees
group by EmployeeName
);
SqlFiddle para varios tipos en Sql 2008
SqlFiddle para varios tipos en Sql 2012
Podrías intentar algo como lo siguiente:
delete T1
from MyTable T1, MyTable T2
where T1.dupField = T2.dupField
and T1.uniqueField > T2.uniqueField
(esto supone que tiene un campo único basado en enteros)
Personalmente, diría que es mejor que intente corregir el hecho de que las entradas duplicadas se agregan a la base de datos antes de que ocurra en lugar de una operación posterior a la reparación.