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

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

Susan Sarandon
Susan Sarandonoriginal
2025-01-05 16:53:40584parcourir

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

Suppression des enregistrements en double d'une table SQL sans clé primaire

Dans une table SQL sans clé primaire, l'identification et la suppression des enregistrements en double peuvent être une tâche complexe. Le problème survient lorsque plusieurs lignes partagent les mêmes valeurs dans des colonnes spécifiques, créant ainsi des redondances dans les données. Pour résoudre ce problème, nous allons explorer une requête qui élimine efficacement les lignes en double en fonction d'une combinaison de colonnes.

Considérez le tableau suivant nommé « employé » avec les données fournies :

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

À supprimez les lignes en double basées sur "EmpId" et "EmpSSN", nous pouvons exploiter les éléments suivants requête :

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

Explication :

  1. La requête interne calcule le numéro de ligne pour chaque ligne en fonction des colonnes de partitionnement « EmpId », « EmpName » et « EmpSSN ». Cette étape identifie l'ordre des lignes pour chaque combinaison unique de ces champs.
  2. La requête externe supprime ensuite les lignes dont le numéro de ligne « cnt » est supérieur à 1, indiquant qu'il existe des lignes en double pour cette combinaison spécifique.

L'exécution de cette requête supprimerait efficacement les enregistrements en double de la table "employé" tout en préservant l'ordre d'origine des données. Après exécution, la table ne contiendrait que des lignes uniques basées sur les champs "EmpId" et "EmpSSN".

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