Supprimer les doublons d'une table SQL sans clé primaire
J'ai le tableau ci-dessous avec les enregistrements dans il
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 de cette table .Mais j'ai ci-dessus enregistre dans ma table déjà.
Je veux supprimer les enregistrements en double qui a la même valeur dans EmpId et EmpSSN champs.
Ex : Emp id 5
Quelqu'un peut-il m'aider à encadrer une requête pour supprimer ces doublons
Merci d'avance
- Pouvez-vous AJOUTER une clé primaire?? Ce système de base de données ou utilisez-vous? Oracle? Veuillez l'indiquer dans votre question!
- Que faire si il a le même EmpID et EmpSSn, mais des noms différents?
- Nous n'avons pas varchar2 dans SQL Server, n'importe quelle version
- Hmmm... pas de "nombre", ni "varchar2" sont valables SQL Server 2005 types de données.... sent comme Oracle pour moi.
- Cela peut être fait très simplement à l'aide d'un CTE, comme ici
Vous devez vous connecter pour publier un commentaire.
Ajouter une Clé Primaire (code ci-dessous)
Exécuter le bon de supprimer (code ci-dessous)
Demandez-vous POURQUOI vous woudln veux pas garder cette clé primaire.
En supposant que MSSQL ou compatible:
C'est très simple. J'ai essayé dans SQL Server 2008
Utiliser le numéro de ligne de différencier les enregistrements en double. Garder le premier numéro de ligne pour un EmpID/EmpSSN et supprimer le reste:
Cela permettra de mettre à jour le Tableau et supprimer tous les doublons de la Table!
Maintenant, le
newtablename
aura pas de doublons.Simplement changer le nom de la table(
newtablename
) en appuyant sur F2 dans l'explorateur d'objets de sql server.Vous pouvez créer une table temporaire
#tempemployee
contenant unselect distinct
de votreemployee
table.Puis
delete from employee
.Puis
insert into employee select from #tempemployee
.Comme Josh dit - même si vous savez que la doublons, la suppression d'entre eux seront impossile puisque vous ne pouvez pas se réfèrent en fait à un enregistrement spécifique si c'est une copie exacte d'un autre enregistrement.
Code
Explication
Utiliser une sous-requête pour créer une vue par-dessus la table qui comprend un champ basé sur
Row_Number()
, partitionné par les colonnes que vous souhaitez être unique.Supprimer les résultats de cette requête interne, la sélection de tout ce qui n'a pas un numéro de ligne de 1; c'est à dire les doublons; pas l'original.
La
order by
de la clause de la fonction row_number fonction de fenêtre est nécessaire pour une syntaxe valide; vous pouvez mettre n'importe quel nom de colonne ici. Si vous souhaitez modifier des résultats est considérée comme un doublon (par exemple, de garder les plus anciennes ou plus récentes, etc), la colonne(s) utilisé ici n'importe; c'est à dire que vous voulez spécifier l'ordre telles que l'enregistrement que vous souhaitez conserver viendra d'abord dans le résultat.Si vous ne voulez pas créer une nouvelle clé primaire, vous pouvez utiliser la commande TOP dans SQL Server:
SA facilité d'utilisation ci-dessous requête
supprimer des sous from (select ROW_NUMBER() OVer(Partition by empid commande par empid)cnt de l'employé)sous
où sous la.cnt>1
Je ne suis pas un SQL expert afin de garder avec moi. Je suis sûr que vous obtiendrez une meilleure réponse assez vite. Voici comment vous pouvez trouver les enregistrements en double.
La suppression d'entre eux seront plus délicat car il n'y a rien dans les données que vous pouvez utiliser dans une instruction delete pour différencier les doublons. Je soupçonne que la réponse va impliquer row_number() ou l'ajout d'une colonne d'identité.
Vous pouvez supprimer l'index si vous n'en avez pas besoin.
pas
ID
, pas derowcount()
ou pastemp table
nécessaire....il y a deux colonnes dans le tableau ID et le nom de l'endroit où les noms sont en répétant avec différents Identifiants donc, pour que vous puissiez utiliser cette requête:
.
.
Avoir une table de base de données sans Clé Primaire est vraiment et de se dire très MAUVAISE PRATIQUE...donc une fois que vous ajoutez un (ALTER TABLE)
Exécuter jusqu'à ce que vous ne voyez pas plus dupliqué dossiers (c'est le but d'AVOIR le COMTE)
MAX([Id]) aura pour effet de supprimer les derniers dossiers (ceux ajoutés après le créé en premier) dans le cas où vous souhaitez le sens opposé que dans le cas d'exiger la suppression d'enregistrements d'abord et laisser le dernier enregistrement inséré veuillez utiliser MIN([Id])
À l'aide de ce que nous pouvons supprimer les enregistrements en double
@ ici " b " est le nom de la colonne à l'unicité,
@ ici "test" est le nom de l'index.