IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

UPDATE concernant plusieurs tables


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 115
    Points : 39
    Points
    39
    Par défaut UPDATE concernant plusieurs tables
    Hello à tous
    Voila mon soucis :
    Je souhaiterai modifier un chiffre dans une Table (1) mais en faisant appelle à des calculs d'élement d'autres tables :
    T1 : Tingredient qui contient :NomIngredient et QtéDispo
    T2 : Trec_ing qui contient NomIngredient (clé primaire de la T1), NomRecette(Clé de la T3) et Qté necessaire
    T3 : Trecette contient: NomRecette

    En gros je veux faire un UPDATE qui permet lorsque l'on selectionne une recette (NomRecette), on soustrait la Qté necessaire à la QtéDispo,
    c'est plutot simple il me semble, mais je n'arrive plus à faire d'UPDATE sur 3 tables.

    mes essais donnaient :

    UPDATE Tingredient SET I.QtéDispo = I.QtéDispo - RI.QtéNecessaire
    FROM Tingredient I, Trec_ing RI, Trecette R
    WHERE I.NomIngredient = RI.NomIngredient
    AND RI.NomRecette = R.NomRecette

    Ne sachant pas comment executer ceci sur 3 tables, j'ai mis FROM, mais je me doute que c'est une grosse erreur.

    Faut'il faire une requette imbriquée ? quelle forme ont elles lors de requetes UPDATE ?

    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par theoffss Voir le message
    En gros je veux faire un UPDATE qui permet lorsque l'on selectionne une recette (NomRecette), on soustrait la Qté necessaire à la QtéDispo

    UPDATE Tingredient SET I.QtéDispo = I.QtéDispo - RI.QtéNecessaire
    FROM Tingredient I, Trec_ing RI, Trecette R
    WHERE I.NomIngredient = RI.NomIngredient
    AND RI.NomRecette = R.NomRecette
    Je pense que ce que ta requête va faire, c'est enlever les quantités nécessires de tous les ingrédients pour toutes les recettes de la table R !

    Il faut remplacer le R.NomRecette par le nom d'UNE recette, celle qui est sélectionnée. La syntaxe dépend du langage qui fait appel à cette requête.

    Ensuite, UPDATE n'aime pas qu'on utilise la table à modifier dans la clause WHERE. Il faut passer par une table temporaire pour faire les jointures et créer le jeu d'enregistrement sur lequel va s'opérer la sélection de la recette à modifier.

    Bon courage
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 115
    Points : 39
    Points
    39
    Par défaut
    effectivement cela va enelver toutes les qté necessaire à tous les ingredient, un simple AND R.NomRecette = ? ... devrait suffire.

    passer par une table temporaire ? comment faire ? je ne comprend pas

    ps : je suis sous access

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Au lieu d'enlever les quantités utilisées par chaque recette au champ QtéDispo de la table Tingredient, je te conseilles plutôt d'ajouter à la table Trecette un champ indiquant combien de recettes ont été effectuées.
    • Tingredient ( NomIngredient, QtéIng )
    • Trec_ing ( #NomIngredient, #NomRecette, QtéNecessaire )
    • Trecette ( NomRecette, NbRecette )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT I.NomIngredient, I.QtéIng - SUM(RI.QtéNecessaire*R.NbRecette) AS QtéDispo
    FROM Tingredient I
      LEFT JOIN Trec_ing RI ON RI.NomIngredient = I.NomIngredient
      LEFT JOIN Trecette R ON R.NomRecette = RI.NomRecette
    GROUP BY I.NomIngredient

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 115
    Points : 39
    Points
    39
    Par défaut
    merci mais je ne voie pas l'interet du nbrecette,

    Pour la petite histoire, au depart j'ai une requette qui m'affiche les recettes dont je possede les ingredients en Qté suffisante.
    En partant de la, il me faut precisement une requette qui me retire les QtéDispo aux QtéNecessaire.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Citation Envoyé par theoffss Voir le message
    Pour la petite histoire, ...
    Pour préciser les choses, peux-tu donner la structure de tes tables, et indiquer ce que tu cherches à obtenir au final avec les requêtes.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 115
    Points : 39
    Points
    39
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Table 1          Table3            Table2
    NomIng-----------NomIng      ------NomRec 
    QtéNecessaire    NomRec------      Preparation
                     QtéDispo
    ce que je souhaite est plutot simple,

    par exemple, j'ai la recette sushi qui contient comme ingredient riz et saumon enQténecessaire 100 pour le riz et 1 pour saumon.
    donc Table1 : sushi et Table 2 : sushi, riz, 100 et sushi saumon 1

    considerons que la Table 1 contenait Riz en QtéDispo 150 et saumon en QtéDispo 3

    je souhaiterai lorsque la requette est executé en selectionant NomRecette sushi qu'un update modifie la Table1 en riz QtéDispo 50 (QtéDispo (150)-QtéNecessaire (100)) et Saumon En QtéDispo 2 ( 3-1).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Personnellement je ne comprend pas pourquoi tu te compliques les choses en mettant 3tables.

    Je mettrai déjà QteNecessaire et QteDispo dans une seule et même table. Et j'enlèverai les accents ^^.


    Si je devais créer les tables je ferai ceci :

    Table 1 : nomIngr (Pk)
    qtNecess
    qtDispo

    Table 2 : nomRec (Pk)
    preparation

    Table 3 (table intermédiaire) : fk_nomIngr (fk)
    fk_preparation (fk)

    En faite 3 tables mais la troisième est une table intermédiaire.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 115
    Points : 39
    Points
    39
    Par défaut
    J'utilise 3 tables pour les raisons suivantes : pouvoirs avoir plusieurs ingrédients par recettes. et un ingrédient etre dans plusieurs recette (donc 0,n >> 0,n) il faut une 3 ieme table (CIF)

    ensuite d'apres tes tables, si je met QtéNecessaire dans la table ingrédients cela ne fonctionnerais pas car un ingrédient nécessite des quantités différentes selon la recette dans laquelle il est utilisé.

    Il n'est pas possible de faire un UPDATE à partir de 3 tables ?

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Essaie un truc dans ce genre là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE Tingredient I
    SET I.QtéDispo = I.QtéDispo - RI.QtéNecessaire
    WHERE I.NomIngredient = 
    (
     SELECT RI.NomIngredient
     FROM Trec_ing RI
     WHERE RI.NomRecette = [recette sélectionée])
    La syntaxe de [recette sélectionnée] dépend du langage de l'interface de ton application. Essaie avec un nom de recette en dur pour commencer.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 115
    Points : 39
    Points
    39
    Par défaut
    Lorsque je l'execute sous acces, elle m'affiche uniquement QtéDispo avec la valeurs initiale, sans avoir fait la soustraction :'(

    Et lorsque la recette à plusieur ingredient il m'envoie le message : cette sous requette peut retourner qu'un seul élément.

    Pour ce pb de sous requete il faut peut etre en imbriquer une 3 ieme ? pour aller chercher NomRecette dans Trecette, elle sera unique dans cette table. non ?

    Edit : Meme erreur en prenant NomRecette dans Trecette ...

    mais la je ne comprend vraiment pas pourquoi la requette n'effectue pas le calcul (lorsqu'il y a un seul ingredient), et comment resoudre le probleme lorsqu'il y en a plusieurs

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 115
    Points : 39
    Points
    39
    Par défaut
    Personne ne saurait ce qui ne va pas ?
    Je suis bloqué :'(

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Comme tu as dis que tu étais sous Access, j'ai vite fait la base avec la requête et ça marche.
    A reproduire chez-toi...
    Sauf qu'apparemment je ne peux pas joindre ici un fichier de type .mdb.
    J'essaie de t'envoyer ça par MP.

    PS : C'est une base Access 2003.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 115
    Points : 39
    Points
    39
    Par défaut
    merci, ça m'enlevera une epine du pied

  15. #15
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Base envoyée via mon adrel personnelle.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. UPDATE sur plusieurs tables ?
    Par Mos dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/04/2007, 08h37
  2. Réponses: 4
    Dernier message: 26/09/2006, 18h28
  3. Update sur plusieurs tables
    Par yoyopi dans le forum DB2
    Réponses: 4
    Dernier message: 24/07/2006, 08h22
  4. Update de plusieurs tables, import fichier csv sql loader
    Par fusuke dans le forum SQL*Loader
    Réponses: 2
    Dernier message: 18/05/2006, 15h08
  5. update sur plusieurs tables
    Par Jean-Matt dans le forum Langage SQL
    Réponses: 14
    Dernier message: 04/01/2006, 14h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo