Supprimer des enregistrements en double dans SQL Server?
Envisager une colonne nommée EmployeeName
table Employee
. L'objectif est de supprimer répété records, basé sur la EmployeeName
champ.
EmployeeName
------------
Anand
Anand
Anil
Dipak
Anil
Dipak
Dipak
Anil
L'aide d'une requête, je veux supprimer les enregistrements qui sont répétés.
Comment cela peut-il être fait avec TSQL dans SQL Server?
- Tu veux dire supprimer les enregistrements en double, droite?
- vous pouvez sélectionner les valeurs distinctes et leurs Id et supprimer les enregistrements dont les Id ne sont pas déjà dans la liste sélectionnée?
- avez-vous une colonne d'ID unique?
- Non je n'ai pas la colonne d'ID Unique
- comment avez-vous accepter la réponse donnée par John Gibb, si la table manque d'identifiant unique? où est le
empId
colonne dans votre exemple utilisé par John ? - Si vous ne disposez pas d'un ID unique colonne, ou n'importe quoi d'autre d'utile à faire une commande d'ici, vous pouvez également commander par la employeename colonne, de sorte que votre rn serait
row_number() over (partition by EmployeeName order by EmployeeName)
... ce serait choisir l'arbitraire d'un seul enregistrement pour chaque nom. - Double Possible de Comment puis-je supprimer les doublons de lignes?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire avec les fonctions de la fenêtre. Il commande les dupes par empId, et de supprimer toutes les mais la première.
L'exécuter en tant que, sélectionnez pour voir ce qui pourrait être supprimé:
ORDER BY (SELECT NULL)
stackoverflow.com/a/4812038En supposant que votre table Employee a également une colonne unique (
ID
dans l'exemple ci-dessous), le travail:Cela laissera la version avec le plus bas de l'ID dans la table.
Modifier
Re McGyver du commentaire de SQL 2012
Pour 2008 R2 et plus tôt,
Pour 2008R2 vous aurez besoin de lancer le
GUID
à un type pris en charge parMIN
, par exempleSqlFiddle pour divers types de Sql 2008
SqlFiddle de différents types dans Sql 2012
Vous pouvez essayer quelque chose comme ce qui suit:
(cela suppose que vous avez un nombre entier en fonction champ unique)
Personnellement je dirais qu'il valait mieux essayer de corriger le fait que les entrées en double sont ajoutés à la base de données avant qu'il ne se produit plutôt que comme un poste fix-it opération.
La magie des expressions de table communes.
Essayer
Si vous êtes à la recherche d'un moyen de supprimer les doublons, mais vous avez une clé étrangère pointant vers la table avec des doublons, vous pouvez prendre les méthodes suivantes à l'aide d'une lente mais efficace curseur.
Il va déménager le des doubles de clés sur la table de clés étrangères.
Voici une belle façon de dédoublonner les enregistrements dans une table qui a une colonne d'identité basée sur un clé primaire que vous pouvez définir à l'exécution. Avant de me lancer, je vais remplir un échantillon de données pour travailler avec l'aide du code suivant:
Prochaine je vais créer un nouveau Type de ColumnNames:
Enfin, je vais créer une procédure stockée avec les 3 suivants en garde:
1. Le proc va prendre un paramètre obligatoire @nom de la table qui définit le nom de la table que vous êtes en train de supprimer à partir de votre base de données.
2. Le proc est un paramètre facultatif @colonnes que vous pouvez utiliser pour définir les champs qui constituent le principal désiré clé que vous supprimez contre. Si ce champ est laissé vide, il est supposé que tous les champs en plus de la colonne d'identité constituent le principal désiré clé.
3. Lorsque des doublons sont supprimés, le record de la plus faible valeur dans la colonne d'identité sera maintenue.
Voici mon delete_dupes stockées proc:
Une fois que cela est respecté, vous pouvez supprimer les enregistrements en double en exécutant le proc. Pour supprimer des doublons sans définir souhaité clé primaire utilisation de cet appel:
Pour supprimer dupes basé sur un définies souhaité clé primaire utilisation de cet appel:
Veuillez voir ci-dessous la suppression trop.
Créé un exemple de table nommée
@Employee
et chargé avec des données fournies.Résultat:
Je sais, c'est demandé il y a six ans, de poster juste au cas où il est utile pour n'importe qui.