Supprimer les enregistrements en double d’une table SQL sans clé primaire

J’ai le tableau ci-dessous avec les enregistrements ci-dessous

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'); 

Je n’ai pas de clé primaire dans cette table. Mais j’ai déjà les enregistrements ci-dessus dans ma table. Je veux supprimer les enregistrements en double qui ont la même valeur dans les champs EmpId et EmpSSN.

Ex: id id 5

Quelqu’un peut-il m’aider à encadrer une requête pour supprimer ces enregistrements en double

Merci d’avance

Ajouter une clé primaire (code ci-dessous)

Exécuter la suppression correcte (code ci-dessous)

Considérez POURQUOI vous ne voudriez pas garder cette clé primaire.


En supposant MSSQL ou 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 

C’est très simple. J’ai essayé dans 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 

Utilisez le numéro de ligne pour différencier les enregistrements en double. Conservez le premier numéro de ligne pour un EmpID / EmpSSN et supprimez le rest:

  DELETE FROM Employee a WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() ) FROM Employee b WHERE a.EmpID = b.EmpID AND a.EmpSSN = b.EmpSSN ) 
 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 ; 

Cela mettra à jour la table et supprimera tous les doublons de la table!

 select distinct * into newtablename from oldtablename 

Désormais, le newtablename du nouveau newtablename ne comportera aucun enregistrement en double.

Changez simplement le nom de la table ( newtablename ) en appuyant sur F2 dans l’explorateur d’objects du serveur SQL.

Vous pouvez créer une table temporaire #tempemployee contenant une select distinct de votre table d’ employee . Ensuite, delete from employee . Ensuite, insert into employee select from #tempemployee .

Comme l’a dit Josh, même si vous connaissez les doublons , leur suppression sera impossible, car vous ne pouvez pas vous référer à un enregistrement spécifique si celui-ci est une copie exacte d’un autre enregistrement.

Code

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

Explication

Utilisez une requête interne pour construire une vue sur la table qui inclut un champ basé sur Row_Number() , partitionné par les colonnes que vous souhaitez être unique.

Supprimer des résultats de cette requête interne, en sélectionnant tout ce qui n’a pas un numéro de ligne de 1; c’est-à-dire les doublons; pas l’original.

La clause order by de la fonction de fenêtre row_number est nécessaire pour une syntaxe valide; vous pouvez mettre n’importe quel nom de colonne ici. Si vous souhaitez modifier le résultat qui est traité en double (par exemple, conserver le plus ancien ou le plus récent, etc.), les colonnes utilisées ici sont importantes; c’est-à-dire que vous voulez spécifier l’ordre tel que l’enregistrement que vous souhaitez conserver viendra en premier dans le résultat.

Si vous ne souhaitez pas créer une nouvelle clé primaire, vous pouvez utiliser la commande TOP dans 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 

Son utilisation facile ci-dessous

 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 

Je ne suis pas un expert SQL, alors supporte-moi. Je suis sûr que vous aurez une meilleure réponse rapidement. Voici comment trouver les enregistrements en double.

 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 

Leur suppression sera plus délicate car il n’y a rien dans les données que vous pourriez utiliser dans une instruction de suppression pour différencier les doublons. Je pense que la réponse impliquera row_number () ou l’ajout d’une colonne d’identité.

  créer un index clusterisé unique Employee_idx
 sur Employee (EmpId, EmpSSN)
 avec ignore_dup_key 

Vous pouvez supprimer l’index si vous n’en avez pas besoin.

aucun ID , aucun rowcount() ou aucune temp table nécessaire ….

 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) 

Il y a deux colonnes dans l’ID d’un tableau et un nom où les noms se répètent avec des ID différents. Vous pouvez donc utiliser cette requête:. .

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

Avoir une table de firebase database sans clé primaire est vraiment et dira extrêmement mauvaise pratique … donc après en avoir ajouté une (ALTER TABLE)

Exécutez ceci jusqu’à ce que vous ne voyiez plus de doublons (c’est le but de HAVING 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]) provoquera la suppression des derniers enregistrements (ceux ajoutés après la première création) au cas où vous voudriez le contraire, à savoir qu’en cas de suppression des premiers enregistrements et de maintien du dernier enregistrement, utilisez MIN ([Id])

 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 
 DELETE FROM 'test' USING 'test' , 'test' as vtable WHERE test.id>vtable.id and test.common_column=vtable.common_column 

En utilisant cela, nous pouvons supprimer les enregistrements en double

  Test ALTER IGNORE TABLE
            AJOUTER UN INDICE UNIQUE 'test' ('b'); 

@ ici ‘b’ est le nom de la colonne à l’unicité, @ ici ‘test’ est le nom de l’index.