Maison >base de données >tutoriel mysql >Comment supprimer les enregistrements en double d'une table SQL sans clé primaire ?

Comment supprimer les enregistrements en double d'une table SQL sans clé primaire ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-03 03:13:40159parcourir

How to Delete Duplicate Records from an SQL Table Without a Primary Key?

Gestion des enregistrements en double dans les tables SQL sans clés primaires

En l'absence de clé primaire, la suppression des enregistrements en double d'une table SQL peut être stimulant. Considérons le scénario suivant :

Une table nommée "employé" contient les enregistrements suivants sans clé primaire :

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

Étant donné cette table, le but est de supprimer les enregistrements en double tout en préservant des uniques. Pour y parvenir, nous pouvons utiliser une combinaison d'une fonction "ROW_NUMBER()" et d'une instruction "DELETE" :

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

Décomposer le code :

  • La requête interne utilise la fonction ROW_NUMBER() pour attribuer un numéro séquentiel à chaque ligne pour chaque groupe d'enregistrements en double. La clause PARTITION BY partitionne les données selon les colonnes EmpId, EmpName et EmpSSN, et ORDER BY EmpId garantit que les lignes sont numérotées dans l'ordre croissant d'EmpId.
  • La requête externe utilise la colonne cnt de la requête interne comme un filtre pour sélectionner uniquement les lignes en double (cnt > 1).
  • L'instruction DELETE utilise la sous-requête pour supprimer le lignes en double de la table d'origine.

En exécutant cette requête, les enregistrements en double dans la table « employé » seront supprimés, ne laissant que les enregistrements uniques :

select * from employee;

EmpId EmpName EmpSSN
1      Jack   555-55-5555
2      Joe    555-56-5555
3      Fred   555-57-5555
4      Mike   555-58-5555
5      Cathy  555-59-5555
6      Lisa   555-70-5555

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn