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
Libérer: 2025-01-03 03:13:40
original
141 Les gens l'ont consulté

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');
Copier après la connexion

É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
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal