Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 13/07/2006, 11h30   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2002
Messages : 34
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 34
Points : 11
Points : 11
Par défaut Mettre à jour une table avec les données d'une autre table

Bonjour,
je voudrais en une seule requête mettre à jour des quantités article dans la table article à partir des quantités relevées dans la table inventaire_article.

Sur Wikipedia, j'ai trouvé ça ;
Citation:
Mise à jour d'une table à partir des informations d'une autre table : UPDATE TABLE1 SET ( champ3, champ4 ) = ( SELECT val32, val13 FROM TABLE2 WHERE TABLE1.CHAMP1 = TABLE2.CHAMP2 ) WHERE ( CHAMP1 ) IN ( SELECT CHAMP2 FROM TABLE2)
Dans moncontexte, ça donne ça :
Code :
1
2
3
4
5
6
 
UPDATE article SET (stock_physique) =
( SELECT quantite_article FROM inventaire_article WHERE article.code_article = inventaire_article.code_article)
WHERE
( article.code_article) IN ( SELECT code_article FROM inventaire_article
WHERE inventaire_article.code_inventaire = 262)
Ça ne marche pas, à cause des parenthèses dans "SET (stock_physique)" et si je les enlève, ma sous-requête renvoyant plusieurs tuples, ça me retourne "multiple rows in singleton select"

Je pensais que le problème était simple.
Il me reste la solution de traiter ça de manière algorithmique dans Delphi, avec un Update paramétré par enregistrement de la table inventaire. Mais j'aurais bien aimé faire ça en une seule requête.
Merci de m'avoir lu.
fplanglois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2006, 12h35   #2
Candidat au titre de Membre du Club
 
Inscription : octobre 2002
Messages : 34
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 34
Points : 11
Points : 11
Par défaut Yes !!!

Avec l'aide d'un collègue nous avons trouvé.
Il fallait ajouter un clause dans la sous-requête, ce qui donne :
Code :
1
2
3
4
5
6
7
8
9
 
UPDATE article
SET
  stock_physique =
  (SELECT quantite_article FROM inventaire_article WHERE article.code_article = inventaire_article.code_article AND inventaire_article.code_inventaire=262)
 
WHERE
( article.code_article) IN ( SELECT code_article FROM inventaire_article
WHERE inventaire_article.code_inventaire = 262)
En revanche, je confirme, en Firebird pas de possibilité de MAJ sur plusieurs champs (le problème des parenthèses) en une seule sous-requête.

Pour produire l'exemple trouvé dans Wikipedia, il faut transformer ainsi :
Code :
1
2
3
4
5
 
UPDATE TABLE1 SET 
champ3 =  (SELECT val32 FROM TABLE2 WHERE TABLE1.CHAMP1 = TABLE2.CHAMP2 ) ,
champ4  =  (SELECT  val13 FROM TABLE2 WHERE TABLE1.CHAMP1 = TABLE2.CHAMP2 ) 
WHERE ( CHAMP1 ) IN ( SELECT CHAMP2 FROM TABLE2)
Ça marche, j'ai essayé, car en fait j'avais besoin de remplacements sur plusieurs champs.
fplanglois est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2006, 12h40   #3
Membre actif
 
Inscription : juin 2004
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 217
Points : 186
Points : 186
Salut

Si j'ai bien compris..... il te manque un SUM

Code :
1
2
3
4
5
 
UPDATE article a SET stock_physique = 
     (SELECT sum(i.quantite_article) 
      FROM inventaire_article i
      WHERE a.code_article = i.code_article AND i.code_inventaire = 262)
A+
cadetill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2006, 17h37   #4
Candidat au titre de Membre du Club
 
Inscription : octobre 2002
Messages : 34
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 34
Points : 11
Points : 11
Citation:
Si j'ai bien compris..... il te manque un SUM
Merci pour la réponse, mais non ce n'est pas ça.
L'article n'apparaît qu'une seule fois dans l'inventaire, donc pas de SUM.

En revanche il pouvait apparaître dans plusieurs inventaires, d'où la nécessité de mettre à jour qu'à partir d'un inventaire donné.
Sinon la requête envoyait bien plusieurs lignes, pour une valeur attendue.
fplanglois 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 10h59.


 
 
 
 
Partenaires

Hébergement Web