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.