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

Requêtes MySQL Discussion :

Update multichamps à partir d'un SELECT


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut Update multichamps à partir d'un SELECT
    Bonjour, après pas mal de recherche je reste bloqué sur une requête sous MySQL.

    Je transfert certains traitements fait sur un serveur ORACLE (11G) vers un serveur MySQL (5.5.8 ou 5.7.14) pour soulager un peu notre serveur.

    Le souci étant sur un UPDATE de plusieurs champs à partir d'une seule requête SELECT, sur Oracle aucun souci mais MySQL refuse la syntaxe.
    Je voulais savoir s'il y avait une syntaxe particulière ou si je dois découper tous mes UPDATE de ce type en plusieurs UPDATE successifs ce qui allongerais malheureusement le temps d’exécution.

    la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE table_update SET (desart,sect) = (SELECT des, sect FROM tarticle WHERE tarticle.soc='GE' AND table_update.famille = tarticle.famille AND table_update.variete = tarticle.variete AND table_update.origine = tarticle.origine)
    erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(desart,sect) = (SELECT des, sect FROM tarticle WHERE tarticle .soc='GE'' at line 1
    Merci beaucoup !

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Supprimez les espaces entre table et colonne ex : tarticle .soc à remplacer par tarticle.soc et ajoutez un alias de table dans la sous requête (ou supprimez simplement tous les alias, vu que vous etes mono-table)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Pour les espaces désolé c'est une faute d’écriture, j'ai changer le nom des tables car c'est des noms barbares et je me suis juste planté en écrivant. Je modifie le POST originel merci.

    Je ne suis pas mono table car je fait correspondre quand même avec la table que j'update, mon problème se situe vraiment sur le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET (desart,sect) = (SELECT des, sect
    MySQL prend t'il en compte cette syntaxe en double champs, depuis un select?

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Effectivement, je n'y avais pas pris garde, utilisez la syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE matable  set col1=subq.val1, col2=subq.val2...
    FROM (select cola as val1, colb as val2...) as subq
    WHERE...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Merci de ta réponse, je ne connais pas du tout cette syntaxe.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    UPDATE table_update SET desart = subq.val1  ,sect = subq.val2 
    FROM (SELECT des as val1, sect as val2 FROM tarticle
    								WHERE tarticle.soc='AG'
    								AND table_update.fam = tarticle.fam
    								AND table_update.var = tarticle.var
    								AND table_update.ori = tarticle.ori) as subq
    Mais cela me sort encore une erreur ...

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Citation Envoyé par alexielle51 Voir le message
    Mais cela me sort encore une erreur ...
    En précisant quelle est l'erreur, ce sera sans doute plus facile de trouver comment la corriger
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Pardon je voulais dire la même erreur,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM (SELECT des as val1, sect as val2 FROM tarticle WHERE tarticle.soc' at line 2

    J'ai essayé de changer la requete comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE table_update SET desart=subq.val1  ,sect=subq.val2 
    FROM (SELECT des as val1, sect as val2, fam, var, ori FROM tarticle WHERE tarticle.soc='AG') as subq 
    								WHERE table_update.fam = subq.fam
    								AND table_update.var = subq.var
    								AND table_update.ori = subq.ori
    et encore la même erreur...

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Votre erreur vient probablement du fait que vous faites un update de 2 colonnes mais votre select en comporte 5 !

    Quoi qu'il en soit, comme expliqué par al1_24, publiez votre message d'erreur complet

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    L'erreur est toujours la meme et je l'ai noté au post précédent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM (SELECT des as val1, sect as val2 FROM tarticle WHERE tarticle.soc' at line 2

    Pour ce qui est des 5 champs, je comprend ce que vous me dite, mais je ne sais pas comment utiliser alors cette syntaxe.

    J'ai essayé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE table_update
    SET desart = subq.val1  ,sect = subq.val2, fam = val3, var = val4, ori = val5
    FROM (SELECT des as val1, sect as val2, fam as val3, var as val4, ori as val5 FROM tarticle WHERE tarticle.soc='AG') as subq 
    								WHERE table_update.fam = subq.fam
    								AND table_update.var = subq.var
    								AND table_update.ori = subq.ori
    Meme si a la base je veux pas UPDATE mes champs fam,var, ori, mais au moins pour avoir autant de select que d'update et tjs l'erreur "You have an error in your SQL syntax;"

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Je double post désolé, c'est juste pour dire que j'ai résolu mon souci.
    J'ai trouvé la syntaxe exacte pour MySQL qui est bien différente de celle qu'Oracle accepte^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE table_update,tarticle
    SET table_update.desart = tarticle.des,
        table_update.sect = tarticle.sect
    WHERE tarticle.soc='AG'
    AND table_update.fam = tarticle.fam
    AND table_update.var = tarticle.var
    AND table_update.ori = tarticle.ori
    Mon problème est donc résolu.
    Merci de votre aide :-)

  11. #11
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut alexielle51.

    Vous devez utilisez les jointures pour êtres conforme à la syntaxe sous MySql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    update      table_update as t1
    inner join  tarticle     as t2
            on  t2.fam = t1.fam
           and  t2.var = t1.var
           and  t2.ori = t1.ori
           and  t2.soc = 'AG'
     
           set  t1.desart = t2.des,
                t1.sect   = t2.sect;
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #12
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Points : 13
    Points
    13
    Par défaut
    Merci merci, après je suis plus SQL 86 ^^ à l'ancienne lol

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Update a partir d'un select
    Par olibara dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/10/2008, 19h03
  2. Update a partir d'une selection
    Par choubak dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/05/2007, 17h28
  3. [oracle 9i]update à partir d'une selection complexe
    Par Requin15 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/06/2006, 10h18
  4. [MySQL] update a partir du resultat d'un select
    Par brice01 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 05/04/2006, 22h44
  5. UPDATE globale à partir d'un SELECT
    Par lilianen dans le forum Oracle
    Réponses: 2
    Dernier message: 28/11/2005, 15h55

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