Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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/06/2011, 16h14   #1
Membre à l'essai
 
Inscription : juin 2007
Messages : 61
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : juin 2007
Messages : 61
Points : 22
Points : 22
Par défaut UPDATE multi table

Bonjour,

Je souhaite faire une requete qui permet de mettre à jour tout les prix à 0 (de la table commande) en multipliant le prix production par le prix unitaire (de la table article). Pour chaque commande, il faudra mettre à jour les prix totaux = 0 par la somme du prix de production par le prix unitaire des articles de la commande correspondante.

En sachant qu'une commande possède plusieurs articles.

J'ai pensé à faire une requête mais mes deux essais se sont averés non concluant...

Code :
1
2
3
UPDATE commande cmd INNER JOIN article art ON art.cmd_id = cmd.cmd_id
   SET cmd.cmd_prix_total = (art.prix_prod * art.prix_unitaire)
 WHERE cmd.cmd_prix_total = 0
Le résultat de ma requete : missing SET keyword

J'ai pensé aussi à faire une requête imbriqué :

Code :
1
2
3
4
5
6
7
8
UPDATE commande cmd
   SET cmd.cmd_prix_total = (SELECT SUM(art.prix_prod *
                                        art.prix_unitaire) AS Invoice_price
                               FROM commande cmd2
                              INNER JOIN article art ON art.cmd_id = cmd2.cmd_id
                              WHERE cmd2.cmd_prix_total = 0
                              GROUP BY cmd2.cmd_numero)
 WHERE cmd.cmd_prix_total = 0
Résultat de la requete : single-row subquery returns more than one row

Le problème de cette dernière requête est que la requête imbriqué renvoie plusieurs valeurs.

La version Oracle est : 10g - 10.2.0.4.0

Quels sont les erreurs que j'ai pu commettre pour avoir pour chaque commande, le prix total de la commande pour chaque articles ?

Je vous remercie d'avance pour toute aide qui pourra m'être apporté
cvexxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 16h32   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
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 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Votre jointure entre les tables article et commande me paraît étrange.
Le numéro de commande serait dans la table des articles ?

Edit : ah oui, votre table article contient en fait le détail de votre commande, est-ce bien ça ?
Si oui, la requête suivante devrait faire l'affaire :
Code :
1
2
3
4
5
UPDATE commande cmd
   SET cmd.cmd_prix_total = (SELECT SUM(art.prix_prod * art.prix_unitaire)
                               FROM article art 
                              WHERE art.cmd_id = cmd.cmd_id)
 WHERE cmd.cmd_prix_total = 0;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 16h37   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 810
Points : 5 810
Utilisez la commande Merge ou utilisez une sous-requête corrélée ou utilisez la syntaxe d’update d’un select ou en dernière recours utilisez PL/SQL.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 16h37   #4
Membre à l'essai
 
Inscription : juin 2007
Messages : 61
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : juin 2007
Messages : 61
Points : 22
Points : 22
Merci de ta réponse,
Le numéro de commande est dans la table commande, le cmd_id, est une clé qui permet identifier quels sont les articles qui appartiennent à une commande.
cvexxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 16h49   #5
Membre à l'essai
 
Inscription : juin 2007
Messages : 61
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : juin 2007
Messages : 61
Points : 22
Points : 22
Merci "mnitu" de me mettre sur la voie, je vais investiguer sur toutes les indications que tu as pu me donner.
cvexxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 16h57   #6
Membre à l'essai
 
Inscription : juin 2007
Messages : 61
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : juin 2007
Messages : 61
Points : 22
Points : 22
Citation:
Envoyé par Waldar Voir le message
Votre jointure entre les tables article et commande me paraît étrange.
Le numéro de commande serait dans la table des articles ?

Edit : ah oui, votre table article contient en fait le détail de votre commande, est-ce bien ça ?
Si oui, la requête suivante devrait faire l'affaire :
Code :
1
2
3
4
5
UPDATE commande cmd
   SET cmd.cmd_prix_total = (SELECT SUM(art.prix_prod * art.prix_unitaire)
                               FROM article art 
                              WHERE art.cmd_id = cmd.cmd_id)
 WHERE cmd.cmd_prix_total = 0;
Le truc c'est que la sous-requête va donner le prix total de tous les articles de toutes les commandes confondues et il faut justement que je mette à jour uniquement pour chaque commande
cvexxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 17h06   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
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 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par cvexxx Voir le message
Le truc c'est que la sous-requete va donner le prix total de tout les articles de toutes les commandes confondues et il faut justement que je mets à jour uniquement pour chaque commandes
Non, il y a bien jointure dans la sous-requête.
Essayez !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/06/2011, 17h44   #8
Membre à l'essai
 
Inscription : juin 2007
Messages : 61
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France

Informations forums :
Inscription : juin 2007
Messages : 61
Points : 22
Points : 22
Tu gères ! Cela fonctionne !
J'étais en train de faire du PL/SQL ! Et cette requête est quand même très optimisée !

Je te remercie ! @bientôt
cvexxx 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 01h54.


 
 
 
 
Partenaires

Hébergement Web