Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 16h44   #1
Membre éclairé
 
Avatar de Lady
 
Femme
Développeur Java
Inscription : mars 2003
Messages : 511
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : mars 2003
Messages : 511
Points : 345
Points : 345
Par défaut Dédoublonnage avec remplacement de clés étrangères

Bonjour!

Une petite problématique de doublon!
Exemple
une table T1 avec la colonne pk en clé et des valeurs
une table T2 qui pointe sur T1

maintenant j'ai ce type de données
T1
pk Valt1
clé1 A
clé2 A


T2
fk Valt2
clé1 toto
clé2 tata

J'ai donc un doublon dans T1 je voudrais le supprimé et ne conservé que la ligne 1 tout en remplaçant dans T2 le clé2 par clé1.

Uniquement la suppression je sais faire ... mais le remplacement je sèche...
Sachant que : je peux avoir plus de 2 fois la même ligne dans T1 et que je suis sous Postgres.

Si vous avez des pistes je suis preneuse!!!

Merci d'avance!
__________________
(Bio)informaticienne folle ... MOUWAWAWAWA
Geekette fan de Marcus et de Nolife !!
Jeune Maman
Lady est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h09   #2
Membre éclairé
 
Avatar de Lady
 
Femme
Développeur Java
Inscription : mars 2003
Messages : 511
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : mars 2003
Messages : 511
Points : 345
Points : 345
Bon j'ai trouvé une solution, je ne sais pas si c'est la meilleur mais je la donne toujours si ça peut aider c'est toujours ça.

Je suis donc passé par une table temporaire contenant 2 colonnes un l'id a gardé et l'autre l'id a remplacer.

Imaginons donc

T1
pk val
1 A
2 A
3 B
4 A
5 B

T2
fk
1
2
5

Code :
1
2
3
4
5
CREATE TEMP TABLE correpondances AS 
SELECT reference.id, toreplace.pk 
FROM (SELECT MIN(pk) AS id, val FROM T1 GROUP BY val HAVING count(*) > 1) AS reference 
INNER JOIN T1 AS toreplace ON reference.val=toreplace.val 
WHERE reference.id != toreplace.pk
Ce qui donne:

correspondances
id pk
1 2
1 4
3 5

Ensuite plus qu'a faire un UPDATE de la table contenant le clé étrangère avec JOINTURE sur la correpondance

Code :
1
2
UPDATE T2 SET fk = correspondances.id
FROM correspondances WHERE T2.fk = correspondances.pk
Et finalement on delete de T1 les doublons

Code :
DELETE FROM T1 WHERE pk IN (SELECT pk FROM correspondances)
__________________
(Bio)informaticienne folle ... MOUWAWAWAWA
Geekette fan de Marcus et de Nolife !!
Jeune Maman
Lady est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/02/2012, 11h28   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 688
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 688
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Bravo pour avoir trouvé par vous-même, mais si vous aviez cherché dans les tutoriels vous seriez probablement tombé sur cet article :
http://sqlpro.developpez.com/cours/doublons/#L2.1.3
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 09h17   #4
Membre éclairé
 
Avatar de Lady
 
Femme
Développeur Java
Inscription : mars 2003
Messages : 511
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : mars 2003
Messages : 511
Points : 345
Points : 345
Citation:
Envoyé par Waldar Voir le message
Bravo pour avoir trouvé par vous-même, mais si vous aviez cherché dans les tutoriels vous seriez probablement tombé sur cet article :
http://sqlpro.developpez.com/cours/doublons/#L2.1.3
Je connais ce tutoriel dont je me suis servis déjà plusieurs fois ces derniers jours (et qui a dû surement m'inspirer dans ma solution ) mais mon problème comme je disais dans mon premier post était la partie remplacement des clés étrangères que je ne visualisait pas trop au moment où j'ai écrit mon premier post (effet fin de journée ).


Sinon si quelqu'un à une idée pour optimiser mes requêtes je suis preneuse car là sur une base moyenne ça me prend 10 bonnes minutes sachant que j'ai une très grosse base sur un des sites que je gère j'ai des sueurs froides !!
__________________
(Bio)informaticienne folle ... MOUWAWAWAWA
Geekette fan de Marcus et de Nolife !!
Jeune Maman
Lady est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 09h26   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 669
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 669
Points : 2 680
Points : 2 680
Bonjour,

Votre méthode ne me semble pas améliorable.

Faites-vous bien un analyze de votre table temporaire avant de lancer les requêtes d'update / delete ?
Code :
1
2
 
analyze correspondance;
Rajouter un index sur votre table correspondance ne me semble pas utile vu qu'il passera surement par un table scan de votre table correspondance pour traiter ceci.

Vous pouvez cepandant essayer :
Code :
1
2
 
CREATE INDEX idx_cor_1 ON correspondance (pk);
Et regardez les plans d'execution pour l'update / delete
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2012, 12h40   #6
Membre éclairé
 
Avatar de Lady
 
Femme
Développeur Java
Inscription : mars 2003
Messages : 511
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : mars 2003
Messages : 511
Points : 345
Points : 345
Citation:
Envoyé par punkoff Voir le message
Bonjour,

Faites-vous bien un analyze de votre table temporaire avant de lancer les requêtes d'update / delete ?
Code :
1
2
 
analyze correspondance;
Ah non tien j'ai pas essayer merci je vais le faire ^^
__________________
(Bio)informaticienne folle ... MOUWAWAWAWA
Geekette fan de Marcus et de Nolife !!
Jeune Maman
Lady est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h39.


 
 
 
 
Partenaires

Hébergement Web