una tabla primaria modificar llave eliminar crear creada con compuesta como clave campo agregar sql sql-server-2005 tsql duplicate-removal

tabla - modificar llave primaria sql server



Eliminar registros duplicados de una tabla SQL sin una clave principal (17)

Agregar una clave principal (código a continuación)

Ejecute la eliminación correcta (código a continuación)

Considera por qué no querrás conservar esa clave principal.

Asumiendo MSSQL o compatible:

ALTER TABLE Employee ADD EmployeeID int identity(1,1) PRIMARY KEY; WHILE EXISTS (SELECT COUNT(*) FROM Employee GROUP BY EmpID, EmpSSN HAVING COUNT(*) > 1) BEGIN DELETE FROM Employee WHERE EmployeeID IN ( SELECT MIN(EmployeeID) as [DeleteID] FROM Employee GROUP BY EmpID, EmpSSN HAVING COUNT(*) > 1 ) END

Tengo la tabla a continuación con los registros a continuación en ella

create table employee ( EmpId number, EmpName varchar2(10), EmpSSN varchar2(11) ); insert into employee values(1, ''Jack'', ''555-55-5555''); insert into employee values (2, ''Joe'', ''555-56-5555''); insert into employee values (3, ''Fred'', ''555-57-5555''); insert into employee values (4, ''Mike'', ''555-58-5555''); insert into employee values (5, ''Cathy'', ''555-59-5555''); insert into employee values (6, ''Lisa'', ''555-70-5555''); insert into employee values (1, ''Jack'', ''555-55-5555''); insert into employee values (4, ''Mike'', ''555-58-5555''); insert into employee values (5, ''Cathy'', ''555-59-5555''); insert into employee values (6 ,''Lisa'', ''555-70-5555''); insert into employee values (5, ''Cathy'', ''555-59-5555''); insert into employee values (6, ''Lisa'', ''555-70-5555'');

No tengo ninguna clave principal en esta tabla. Pero ya tengo los registros anteriores en mi tabla. Quiero eliminar los registros duplicados que tienen el mismo valor en los campos EmpId y EmpSSN.

Ej: Emp id 5

¿Alguien me puede ayudar a enmarcar una consulta para eliminar esos registros duplicados?

Gracias por adelantado


Es muy simple. Lo intenté en SQL Server 2008

DELETE SUB FROM (SELECT ROW_NUMBER() OVER (PARTITION BY EmpId, EmpName, EmpSSN ORDER BY EmpId) cnt FROM Employee) SUB WHERE SUB.cnt > 1


No soy un experto SQL así que tengan paciencia conmigo. Estoy seguro de que obtendrás una mejor respuesta lo suficientemente pronto. A continuación, le mostramos cómo puede encontrar los registros duplicados.

select t1.empid, t1.empssn, count(*) from employee as t1 inner join employee as t2 on (t1.empid=t2.empid and t1.empssn = t2.empssn) group by t1.empid, t1.empssn having count(*) > 1

Eliminarlos será más complicado porque no hay nada en los datos que pueda usar en una declaración de eliminación para diferenciar los duplicados. Sospecho que la respuesta incluirá row_number () o agregará una columna de identidad.


Puede crear una tabla temporal #tempemployee contenga una select distinct de su tabla de employee . A continuación, delete from employee . Luego insert into employee select from #tempemployee .

Como dijo Josh, incluso si conoce los duplicados , eliminarlos será imposible ya que no puede referirse a un registro específico si es un duplicado exacto de otro registro.


SU uso fácil debajo de la consulta

WITH Dups AS ( SELECT col1,col2,col3, ROW_NUMBER() OVER(PARTITION BY col1,col2,col3 ORDER BY (SELECT 0)) AS rn FROM mytable ) DELETE FROM Dups WHERE rn > 1


Si no desea crear una nueva clave principal, puede usar el comando TOP en SQL Server:

declare @ID int while EXISTS(select count(*) from Employee group by EmpId having count(*)> 1) begin select top 1 @ID = EmpId from Employee group by EmpId having count(*) > 1 DELETE TOP(1) FROM Employee WHERE EmpId = @ID end


Tener una tabla de base de datos sin clave principal es realmente y será extremadamente mala práctica ... así que después de agregar una (ALTER TABLE)

Ejecute esto hasta que no vea más registros duplicados (ese es el propósito de TENER COUNT)

DELETE FROM [TABLE_NAME] WHERE [Id] IN ( SELECT MAX([Id]) FROM [TABLE_NAME] GROUP BY [TARGET_COLUMN] HAVING COUNT(*) > 1 ) SELECT MAX([Id]),[TABLE_NAME], COUNT(*) AS dupeCount FROM [TABLE_NAME] GROUP BY [TABLE_NAME] HAVING COUNT(*) > 1

MAX ([Id]) hará que se eliminen los últimos registros (los que se agregaron después de la primera creación) en caso de que desee el significado opuesto que en caso de requerir borrar los primeros registros y dejar el último registro insertado, utilice MIN ([Id])


Use el número de fila para diferenciar entre registros duplicados. Guarde el primer número de fila para EmpID / EmpSSN y elimine el resto:

DELETE FROM Employee a WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() ) FROM Employee b WHERE a.EmpID = b.EmpID AND a.EmpSSN = b.EmpSSN )


hay dos columnas en el ID de una tabla y un nombre donde los nombres se repiten con diferentes ID, por lo que puede usar esta consulta:. .

DELETE FROM dbo.tbl1 WHERE id NOT IN ( Select MIN(Id) AS namecount FROM tbl1 GROUP BY Name )


no se necesita ID , rowcount() ni temp table ...

WHILE ( SELECT COUNT(*) FROM TBLEMP WHERE EMPNO IN (SELECT empno from tblemp group by empno having count(empno)>1)) > 1 DELETE top(1) FROM TBLEMP WHERE EMPNO IN (SELECT empno from tblemp group by empno having count(empno)>1)


Código

DELETE DUP FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY Clientid ORDER BY Clientid ) AS Val FROM ClientMaster ) DUP WHERE DUP.Val > 1

Explicación

Use una consulta interna para construir una vista sobre la tabla que incluya un campo basado en Row_Number() , particionado por aquellas columnas que desea que sean únicas.

Eliminar de los resultados de esta consulta interna, seleccionando cualquier cosa que no tenga un número de fila de 1; es decir, los duplicados; no el original

La order by cláusula de la función de ventana row_number es necesaria para una sintaxis válida; puedes poner cualquier nombre de columna aquí. Si desea cambiar cuál de los resultados se trata como un duplicado (por ejemplo, guarde los primeros o más recientes, etc.), las columnas utilizadas aquí sí importan; es decir, desea especificar el orden tal que el registro que desea conservar aparecerá primero en el resultado.


DELETE FROM ''test'' USING ''test'' , ''test'' as vtable WHERE test.id>vtable.id and test.common_column=vtable.common_column

Usando esto podemos eliminar registros duplicados


With duplicates As (Select *, ROW_NUMBER() Over (PARTITION by EmpID,EmpSSN Order by EmpID,EmpSSN) as Duplicate From Employee) delete From duplicates Where Duplicate > 1 ;

¡Esto actualizará la Tabla y eliminará todos los duplicados de la Tabla!


select distinct * into newtablename from oldtablename

Ahora, el nuevo nombre de newtablename no tendrá registros duplicados.

Simplemente cambie el nombre de la tabla ( newtablename ) presionando F2 en el explorador de objetos en el servidor sql.


select t1.* from employee t1, employee t2 where t1.empid=t2.empid and t1.empname = t2.empname and t1.salary = t2.salary group by t1.empid, t1.empname,t1.salary having count(*) > 1


ALTER IGNORE TABLE test ADD UNIQUE INDEX ''test'' (''b'');

@ aquí ''b'' es el nombre de la columna para unicidad, @ aquí ''prueba'' es el nombre del índice.


create unique clustered index Employee_idx on Employee ( EmpId,EmpSSN ) with ignore_dup_key

Puede soltar el índice si no lo necesita.