Considere una columna llamada EmployeeName
tabla Employee
. El objetivo es eliminar registros repetidos, según el EmployeeName
campo.
EmployeeName
------------
Anand
Anand
Anil
Dipak
Anil
Dipak
Dipak
Anil
Usando una consulta, quiero eliminar los registros que se repiten.
¿Cómo se puede hacer esto con TSQL en SQL Server?
sql
tsql
duplicates
delete-row
usr021986
fuente
fuente
empId
columna de tu ejemplo utilizada por John?row_number() over (partition by EmployeeName order by EmployeeName)
... esto elegiría un solo registro arbitrario para cada nombre .Respuestas:
Puede hacer esto con funciones de ventana. Ordenará los duplicados por vacío y eliminará todos menos el primero.
Ejecútelo como una selección para ver qué se eliminaría:
fuente
ORDER BY (SELECT NULL)
stackoverflow.com/a/4812038Suponiendo que su tabla de empleados también tiene una columna única (
ID
en el ejemplo siguiente), lo siguiente funcionará:Esto dejará la versión con el ID más bajo en la tabla.
Edite
el comentario de Re McGyver - a partir de SQL 2012
Para 2008 R2 y versiones anteriores,
Para 2008R2, deberá convertir el
GUID
a un tipo compatible conMIN
, por ejemploSqlFiddle para varios tipos en Sql 2008
SqlFiddle para varios tipos en Sql 2012
fuente
Puede probar algo como lo siguiente:
(esto supone que tiene un campo único basado en números enteros)
Personalmente, aunque diría que es mejor que intente corregir el hecho de que se agregan entradas duplicadas a la base de datos antes de que ocurra en lugar de como una operación posterior a la reparación.
fuente
fuente
La magia de las expresiones de tabla comunes.
fuente
Tratar
fuente
Si está buscando una forma de eliminar duplicados, pero tiene una clave externa que apunta a la tabla con duplicados, puede tomar el siguiente enfoque utilizando un cursor lento pero efectivo.
Reubicará las claves duplicadas en la tabla de claves externas.
fuente
fuente
Consulte también la forma de eliminación a continuación.
Creó una tabla de muestra con un nombre
@Employee
y la cargó con los datos dados.Resultado:
Lo sé, esto se preguntó hace seis años, y lo publiqué solo en caso de que sea útil para alguien.
fuente
Esta es una buena forma de deduplicar registros en una tabla que tiene una columna de identidad basada en una clave primaria deseada que puede definir en tiempo de ejecución. Antes de comenzar, completaré un conjunto de datos de muestra para trabajar usando el siguiente código:
A continuación, crearé un tipo llamado ColumnNames:
Finalmente, crearé un proceso almacenado con las siguientes 3 advertencias: 1. El proceso tomará un parámetro requerido @tablename que define el nombre de la tabla que está eliminando en su base de datos. 2. El proc tiene un parámetro opcional @columns que puede utilizar para definir los campos que componen la clave primaria deseada contra la que está eliminando. Si este campo se deja en blanco, se asume que todos los campos además de la columna de identidad constituyen la clave primaria deseada. 3. Cuando se eliminan registros duplicados, se mantendrá el registro con el valor más bajo en su columna de identidad.
Aquí está mi proceso almacenado delete_dupes:
Una vez que se cumpla con esto, puede eliminar todos sus registros duplicados ejecutando proc. Para eliminar duplicados sin definir una clave primaria deseada, use esta llamada:
Para eliminar duplicados en función de una clave primaria deseada definida, utilice esta llamada:
fuente