3 votes

Supprimer les lignes en double #2

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

Ce que je veux faire, c'est ceci :

  1. Ne sélectionner que les lignes distinctes.
  2. Supprimer les lignes dont le champ "id" est dupliqué.

Prenons une table :

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

Ce que je veux obtenir, c'est.. :

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

La ligne avec l'identifiant 2 est conservée dans une copie, tandis que les lignes avec l'identifiant 3 ont été supprimées.

Je pensais à.. :

  1. SELECT DISTINCT id, a, b FROM table pour n'obtenir que des lignes distinctes.
  2. Filtrer d'une manière ou d'une autre le résultat de (1) pour supprimer les identifiants en double.

Quelle serait la meilleure façon de procéder ?

2voto

jzd Points 17369

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

0voto

DRapp Points 23901

Petr, il semblerait, d'après les commentaires, que vous souhaitiez une COMBINAISON...

I Toutes les lignes où l'ID n'apparaît qu'une seule fois. Toutes les lignes où l'identifiant apparaît PLUS d'une fois -- ET tous les autres champs de l'enregistrement sont identiques.

E Toute ligne où l'ID apparaît plus d'une fois -- ET où 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 d'autres colonnes que a et b à comparer, il vous suffit d'ajouter les valeurs respectives à la liste des champs de sélection et au champ correspondant. D'après l'échantillon de données que vous avez fourni, les valeurs renvoyées par la requête seraient les suivantes

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, la ligne ID = 3 sera rejetée puisque l'avoir échouera sur un même min() et max() de la même colonne sur les DEUX colonnes. Vous pouvez ensuite copier ces données dans un nouveau tableau. Un seul passage dans le tableau...

0voto

SK9 Points 9683

Pouvez-vous reconstruire la base de données, ou sinon en créer une nouvelle à partir de l'originale, avec l'identifiant comme clé primaire ? SQL peut s'occuper du reste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X