57 votes

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: Emp id 5

Quelqu'un peut-il m'aider à définir une requête pour supprimer ces enregistrements en double?

Merci d'avance

83voto

Anjib Rajkhowa Points 321

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
 

59voto

cjk Points 27463

Ajouter une clé primaire (code ci-dessous)

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

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


En supposant que 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
 

24voto

Paul Morgan Points 6058

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 reste:

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

12voto

Nirav Parikh Points 91
 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 ;
 

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

6voto

Daren Thomas Points 26812

Vous pouvez créer une table temporaire #tempemployee contenant un select distinct de votre table employee . Puis delete from employee . Puis insert into employee select from #tempemployee .

Comme Josh l'a dit - même si vous connaissez les doublons , leur suppression sera impossible, car vous ne pouvez pas vous référer à un enregistrement spécifique s'il s'agit d'un duplicata exact d'un autre enregistrement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X