2011-09-22 6 views
0

Je suis en train de télécharger et de mettre à jour ma base de données à partir de données provenant d'une source tierce. Malheureusement, il existe de nombreux enregistrements en double dans les données de la source de données tierce.Comment supprimer des données en double de la table SQL

J'ai regardé quelques questions ici sur SO, mais toutes semblent être des cas où il y a une colonne d'identification qui différencie une rangée de l'autre.

Dans mon cas, il n'y a pas de colonne ID. par exemple.

State City SubDiv Pincode Locality Lat Long 
Orissa Koraput Jeypore 764001 B.D.Pur 18.7743 82.5693 
Orissa Koraput Jeypore 764001 Jeypore 18.7743 82.5693 
Orissa Koraput Jeypore 764001 Jeypore 18.7743 82.5693 
Orissa Koraput Jeypore 764001 Jeypore 18.7743 82.5693 
Orissa Koraput Jeypore 764001 Jeypore 18.7743 82.5693 

Existe-t-il une requête simple que je peux exécuter pour supprimer tous les enregistrements en double et conserver un enregistrement comme original? Donc, dans le cas ci-dessus, je veux supprimer les lignes 3,4,5 de la table.

Je ne sais pas si cela peut être fait en utilisant des instructions SQL simples mais aimerait savoir d'autres avis comment cela peut se faire

+4

Pouvez-vous pas seulement ajouter une colonne ID à votre table, puis utilisez l'une des méthodes que vous avez déjà lu au sujet? En outre, il peut être intéressant de ne pas importer les doublons de l'autre source de données, si vous ne les souhaitez pas dans votre table. –

Répondre

5

j'insérer les données de tiers à un table temporaire que puis:

insert into 
    target_table 
select distinct 
    * 
from 
    temporary_table 

et enfin supprimer la table temporaire. Seules les lignes distinctes (uniques) seront insérées dans la table cible.

+1

+1 Une autre approche consiste à copier les données dans la table temporaire avec 'DISTINCT'. J'aime mieux cette approche car elle vous donne une chance de valider le résultat de l'opération; 'delete cte où rn> 1' * devrait * aussi fonctionner mais si vous faites une erreur, vous avez déjà détruit des données. –

+0

Je voulais simplement ajouter que cette solution fonctionne très bien (tout comme la solution proposée par @ t-clausen.dk) mais ne fait rien pour empêcher que cela ne se reproduise. Après déduplication, vous devez mettre un index unique sur la clé naturelle de vos données. Vous devrez peut-être également corriger votre processus d'importation. – HLGEM

7
;with cte as(
select State City, SubDiv, Pincode, Locality, Lat, Long, 
row_number() over (partition by City, SubDiv, Pincode, Locality, Lat,Long order by City) rn 
from yourtable 
) 
delete cte where rn > 1 
3

L'un des

  • ajouter une colonne à dé-dupliquer et laisser
  • faire un SELECT DISTINCT * INTO ANewTable FROM OldTable puis renomme etc
  • Utiliser l'approche CTE t-clausen.dk

Et puis ajoutez un index unique sur les colonnes souhaitées

0

Essayez cette

alter table mytable add id int identity(1,1) 

delete mytable where id in (
select duplicateid from (select ROW_NUMBER() over (partition by State ,City ,SubDiv ,Pincode ,Locality ,Lat ,Long order by State ,City ,SubDiv ,Pincode ,Locality ,Lat ,Long) duplicateid 
from mytable) t where duplicateid !=1) 

alter table mytable drop column id 
+0

'id in (select *'? Quelle valeur ajoute la colonne identity? Ceci est proche mais voir la réponse de @ t-clausen.dk - aucune colonne d'identité nécessaire –

+0

Si vous postez du code, du XML ou des exemples de données, ** please * * mettez en surbrillance ces lignes dans l'éditeur de texte et cliquez sur le bouton "échantillons de code" ('{}') dans la barre d'outils de l'éditeur pour bien le mettre en forme et la mettre en évidence! –

Questions connexes