[REGLE] dédoublonner une table


e-kiwi
Modérateur
Modérateur
 
Messages: 15617
Inscription: 23 Déc 2003

[REGLE] dédoublonner une table

Message le Jeu Mai 11, 2006 9:25

Bonjour,

j'ai une table d'association d'articles à des entreprises (id_art et id_ent) sauf que j'ai des doublons. comment je fais EN SQL la requete magique qui va me supprimer tous les doublons de ma table ?

merci !
Dernière édition par e-kiwi le Jeu Mai 11, 2006 10:58, édité 1 fois.

DaMonkey
WRInaute discret
WRInaute discret
 
Messages: 79
Inscription: 20 Fév 2004

Message le Jeu Mai 11, 2006 9:50

Quand tu parles doublons, tu parles du libellé de l'article mais avec id_art et id_ent différents, ou des doublons genre deux enregistrements comportant le meme id_art et meme id_ent ?

spidetra
WRInaute passionné
WRInaute passionné
 
Messages: 1500
Inscription: 7 Juil 2003

Message le Jeu Mai 11, 2006 10:13

1. Tu fais d'abord un SELECT pour identifier tes doublons. Un truc du style ( à adapter ) :

Code: Tout sélectionner
SELECT id_art, id_ent, count(*)
FROM latable
GROUP BY id_art, id_ent
HAVING count(*) > 1


2. Si la sélection te semble correcte, tu remplace l'instruction SELECT, par une instruction DELETE. Je m'abstiendrai d'écrire le DELETE :D
Evidemment avant, tu as fait une petite sauvegarde de ta table...

EDIT : Le passage du SELECT au DELETE est pas aussi direct que ça. Si tu fait un DELETE de la sélection tu vas effacer tout les enregistrements qui sont en double, et c'est pas ce que tu veux faire.
Dernière édition par spidetra le Jeu Mai 11, 2006 10:17, édité 1 fois.


Bacteries
WRInaute passionné
WRInaute passionné
 
Messages: 1369
Inscription: 27 Mai 2004

Message le Jeu Mai 11, 2006 10:15

Un distinct dans la requête Select aussi. Tout dépend de comment sont tes doublons.

Et comme conseillé par spidetra faire des tests avant ;)

spidetra
WRInaute passionné
WRInaute passionné
 
Messages: 1500
Inscription: 7 Juil 2003

Message le Jeu Mai 11, 2006 10:27

Une solution assez simple consiste a passer par une table temporaire :
Code: Tout sélectionner
SELECT DISTINCT id_art, id_ent
INTO   table_temp
FROM   latable
GROUP  BY id_art, id_ent
HAVING COUNT(*) > 1


suppression des doublons dans la table. A MANIPULER APRES SAUVEGARDE
Code: Tout sélectionner
DELETE
FROM latable t1
WHERE  EXISTS (SELECT *
               FROM   latable t2
               WHERE  t1.id_art = t2.id_art
                 AND  t1.id_ent = t2.id_ent
               GROUP  BY id_art,  id_ent
               HAVING COUNT(*) > 1)


recopie de la table temporaire dans ta table
Code: Tout sélectionner
INSERT INTO latable
SELECT id_art, id_ent
FROM   table_temp


suppression de la table temporaire
Code: Tout sélectionner
DROP TABLE table_temp


e-kiwi
Modérateur
Modérateur
 
Messages: 15617
Inscription: 23 Déc 2003

Message le Jeu Mai 11, 2006 10:57

oki thanks c'est good. merki !

spidetra
WRInaute passionné
WRInaute passionné
 
Messages: 1500
Inscription: 7 Juil 2003

Message le Jeu Mai 11, 2006 11:54

Il y a quand même un petit truc que je ne comprends pas :

- table Article : PK : id_art
- table Entreprise : PK : id_ent

La clé primaire de ta table d'association devrait être une clé composite ( id_art, id_ent ).
Tu ne devrais pas avoir de doublons sur ces 2 colonnes.

C'est quoi la clé primaire de ta table d'association ?

Si tu ne peux pas transformer (id_art, id_ent) en clé primaire, tu devrais au moins mettre un INDEX UNIQUE sur ces 2 colonnes pour éviter les doublons dans le futur.


e-kiwi
Modérateur
Modérateur
 
Messages: 15617
Inscription: 23 Déc 2003

Message le Jeu Mai 11, 2006 12:37

d'apres toi pourquoi je cherches à virer les doublons ? :) pour reparer l'erreur de précédent webmaster en transformant ces clés en index+clés primaires. et chose faite, je passe de 4mn à 2 sec ma requete, je suis content :)

ps : comme tu l'a rectifié, ta requete supprimai les doublons, mais les 2 enregistrements :) je l'ai donc fait en php. problème réglé

spidetra
WRInaute passionné
WRInaute passionné
 
Messages: 1500
Inscription: 7 Juil 2003

Message le Jeu Mai 11, 2006 12:48

comme quoi rien ne vaut une bonne conception :lol:


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités