Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
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 24/11/2011, 18h15   #1
Membre du Club
 
Inscription : avril 2006
Messages : 181
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 181
Points : 45
Points : 45
Par défaut mettre à jour plusieurs enregistrements avec jointure

Bonjour,

Je cherche a mettre à jour la colonne d'une table pour des enregistrements spécifiques.
ces enregistrement sont le résultat d'une sélection avec jointure sur trois tables.

Code :
1
2
3
4
5
6
mettre à jour Tab_1
SET Zone_1 = 'ACT'
pour 
(SELECT * FROM Tab_1, Tab_2, Tab_3
 WHERE Tab_1.Zone_2 = Tab_2.Zone_2
    AND Tab_1.Zone_2 = Tab_3.Zone_2)
Sachant que la sous requête en rouge retourne plusieurs enregistrements.

en résumant: je veut donner la valeur 'ACT' à la Zone_1 de la Tab_1 que pour les enregistrements sélectionnés par la sous requête en rouge.

Est ce que quelqu'un peut m'aider, car ça fait trois jours que je galère

Merci à vous par avance.
nsqualli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2011, 19h10   #2
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Code :
1
2
3
4
5
UPDATE Tab_1
SET Zone_1 = 'ACT'
WHERE EXISTS ( SELECT 1 FROM Tab_1, Tab_2, Tab_3
                      WHERE Tab_1.Zone_2 = Tab_2.Zone_2
                      AND Tab_1.Zone_2 = Tab_3.Zone_2 )
devrait faire l'affaire.

J'aurais plutôt fait un JOIN entre les tables, mais bon !
Mercure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 07h25   #3
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 653
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 653
Points : 2 655
Points : 2 655
Bonjour,


Je penses qu'il faudrait quand même dégager Tab1 de la sous-requete de l'existe :

Code sql :
1
2
3
4
5
6
7
8
 
UPDATE Tab_1
SET Zone_1 = 'ACT'
WHERE EXISTS 
( SELECT 1 
FROM Tab_2
INNER JOIN tab_3 ON Tab_3.Zone_2 = Tab_2.Zone_2
WHERE Tab_1.Zone_2 = Tab_2.Zone_2)
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 09h59   #4
Membre du Club
 
Inscription : avril 2006
Messages : 181
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 181
Points : 45
Points : 45
Citation:
Envoyé par Mercure Voir le message
Code :
1
2
3
4
5
UPDATE Tab_1
SET Zone_1 = 'ACT'
WHERE EXISTS ( SELECT 1 FROM Tab_1, Tab_2, Tab_3
                      WHERE Tab_1.Zone_2 = Tab_2.Zone_2
                      AND Tab_1.Zone_2 = Tab_3.Zone_2 )
devrait faire l'affaire.

J'aurais plutôt fait un JOIN entre les tables, mais bon !
Merci pour ta réponse, mais j'ai déjà essayé cette solution, mais elle fait la mise à jour de tous les enregistrements de la table Tab_1, car avec le "WHERE EXISTS" la mise à jour se fait même si la sous requête retourne ne retourne qu'un seul enregistrement, et elle ne le fait pas si la sous requête ne retourne aucun enregistrement.

dans mon cas la MàJ doit se faire sur 711 enregistrement alors que là elle me le fait sur 2079990 lignes mises à jour.
nsqualli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 10h21   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 653
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 653
Points : 2 655
Points : 2 655
c'est normal vous ne faites aucune restriction sur votre tab_1 updatée avec cette solution.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 10h57   #6
Membre du Club
 
Inscription : avril 2006
Messages : 181
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 181
Points : 45
Points : 45
Citation:
Envoyé par punkoff Voir le message
Bonjour,


Je penses qu'il faudrait quand même dégager Tab1 de la sous-requete de l'existe :

Code sql :
1
2
3
4
5
6
7
8
 
UPDATE Tab_1
SET Zone_1 = 'ACT'
WHERE EXISTS 
( SELECT 1 
FROM Tab_2
INNER JOIN tab_3 ON Tab_3.Zone_2 = Tab_2.Zone_2
WHERE Tab_1.Zone_2 = Tab_2.Zone_2)
Tu as raison
Merci beaucoup, elle marche magnifiquement bien Merci encore.
nsqualli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 19h03   #7
Membre Expert
 
Inscription : novembre 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 1 298
Points : 1 355
Points : 1 355
Oui, c'est bien çà. J'ai oublié d'enlever Tab_1 de la sous-requête, sorry. Grrr
Mercure 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 17h50.


 
 
 
 
Partenaires

Hébergement Web