2011-01-27 4 views
3

J'ai une table (grande ~ 1 000 000 lignes) qui contient potentiellement des lignes dupliquées (valeurs NULL possibles).Supprimer les lignes dupliquées # 2

Ce que je veux faire est la suivante:

  1. Sélectionnez seulement DISTINC lignes.
  2. Supprimez les lignes avec le champ 'id' en double.

Ayons une table:

id | a | b  
1 | 2 | 3  
2 | 8 | 7  
3 | 9 | 10  
2 | 8 | 7  
3 | 20| 12 

Ce que je veux est:

id | a | b  
1 | 2 | 3  
2 | 8 | 7 

Row avec id 2 est conservé dans une copie, alors que les lignes avec id 3 ont été enlevés.

Je pensais:

  1. SELECT DISTINCT id, a, b FROM table; pour obtenir seulement des lignes distinctes.
  2. En quelque sorte, filtrez le résultat de (1) pour supprimer les ID en double.

Quelle serait la meilleure façon d'aborder cela?

+2

Je suis curieux de savoir ce que vous avez trouvé lorsque vous avez entré 'sql remove duplicate rows' dans le champ de recherche SO. Avez-vous eu les quarante pages de résultats que j'ai faites? :-) Désolé, ne pouvait pas résister à la jab: voir http://stackoverflow.com/search?q=sql+remove+duplicate+rows – paxdiablo

+1

La ligne 2 est répétée deux fois et il est listé ci-dessous, mais la ligne 1 n'est pas répétée deux fois et il est également listé ci-dessous. C'est un peu confus, je suppose que vous vouliez avoir seulement la rangée 1 ci-dessous, ou peut-être la rangée 1 et la rangée 3? – Neil

+0

@Neil, je pense que «2» a survécu parce que le contenu était identique.'3' a été jeté parce que les deux enregistrements étaient différents (en d'autres termes, garder une copie d'un identifiant si toutes les copies sont identiques, sinon jeter), ce qui rend probablement mon commentaire smarmy dessus inexact car cela semble être assez spécial affaire :-) Toutes mes excuses à Petr si c'est le cas. – paxdiablo

Répondre

0

Petr, il semble que par les commentaires, vous voulez une COMBINAISON ...

Inclure: toutes les lignes où l'ID se produit Une seule fois toutes les lignes où l'ID se produit plus d'une fois - et tous les autres champs de l'enregistrement sont les mêmes

EXCLURE: Toute ligne où l'ID se produit plus d'une fois - ET les autres champs ne correspondent pas exactement.

select ID, min(a) a, min(b) b 
    from YourTable 
    group by ID 
    having min(a) = max(a) 
     and min(b) = max(b) 

Si vous avez plusieurs colonnes en dehors de a et b de comparer, il suffit d'ajouter les valeurs respectives à la liste des champs de sélection et le correspondant ayant. A partir de l'échantillon de données que vous avez fournies, les valeurs de retour de la requête serait

ID MIN(A) MIN(B) Having MIN(A) MAX(A) MIN(B) MAX(B) 
1 2  3    2  2  3  3 
2 8  7    8  8  7  7 
3 9  10    9  20  10  12  

Ainsi, l'ID de ligne = 3 va se ballottés depuis le ayant échouera sur un même min() et max() du même colonne sur les deux colonnes. Ensuite, vous pouvez copier ceci dans une nouvelle table. Un seul passage dans la table ...

2

Troisième réponse maintenant que la question est un peu plus claire:

SELECT id, min(a) as a, min(b) as b 
FROM (SELECT DISTINCT id, a, b FROM table) t 
GROUP BY id 
HAVING count(*) =1 
+0

Le problème est que la table doit contenir toutes les lignes. Le filtrage doit être fait lors de la sélection des données ... – Petr

+0

@Petr Votre question dit: '2. Supprimer les lignes avec le champ 'id' en double. ' Ce qui est confus. – jzd

+0

Je voulais dire "supprimer des résultats SELECT", pas de la table elle-même. Pardon. – Petr

0

Pouvez-vous reconstruire la base de données, ou si vous n'en créez pas une nouvelle, avec l'ID comme clé primaire? SQL peut s'occuper du reste.

+1

Cela devrait aller dans le commentaire pas dans la réponse ;-) – Chintan

Questions connexes