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 :

Mettre à jour plusieurs champs avec la même requête, est-ce possible ?


Sujet :

Langage SQL

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Points : 328
    Points
    328
    Par défaut Mettre à jour plusieurs champs avec la même requête, est-ce possible ?
    Bonjour à tous.

    J'ai plusieurs champs à mettre à jour à faire dans une table, et toutes les valeurs pourraîent être récupérées en une seule et même requête, sauf que je ne vois pas comment faire...

    Actuellement, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update ma_table
    set champ_1=(select val_1 from [mes_jointures] where [mes_conditions]),
    champ_2=(select val_2 from [mes_jointures] where [mes_conditions]), 
    etc.
    avec bien entendu, mes_jointures et mes_conditions qui sont les mêmes dans les 2 cas.

    Cette requête est particulièrement lourde, et elle va tourner pour chacun des champs à mettre à jour, non ?
    Bref, je voudrais un équivalent au :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert into ma_table 
    select val_1, val_2 from [mes_joitnure] where [mes_conditions]
    mais pour le UPDATE. Y'a moyen de faire ça ???

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 406
    Points
    28 406
    Par défaut
    Quel SGBD utilises-tu ?
    Deux syntaxes peuvent être proposées suivant les éditeurs :
    La première est conforme à la norme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE table
    SET (col1, coln) = (SELECT ....)
    ;
    La seconde n'est pas conforme à la norme... mais bien pratique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE table
    SET col1 = a.col1
     , coln = a.coln
    FROM table2 AS a
    WHERE ...
    ;

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Points : 328
    Points
    328
    Par défaut
    Cool, merci.

    La 1ère syntaxe semble fonctionner.
    Dommage que cette syntaxe n'est pas présente dans SQL de A à Z sur le site.
    Par contre, la 2ème non (sous Oracle 9.2)...ce qui est bien dommage, car survient un 2ème soucis.

    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update ma_table t
    set (champ_1, champ_2=
    (select val_1, val_2 from autre_table x where x.lien_t=t.lien_x and t.ID=1)
    avec t.ID l'identifiant de ma table, toutes les lignes sont mises à jour. Et toutes celles pour lesquelles la clause WHERE de la sous-requête n'est pas vérifiées sont mise à NULL.
    C'est effectivement logique, mais je n'avais pas anticipé le problème.

    Je dois donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update ma_table t
    set (champ_1, champ_2)=
    (select val_1, val_2 from autre_table x where x.lien_t=t.lien_x and t.ID=1)
    where not
    (select val_1 from autre_table x where x.lien_t=t.lien_x and t.ID=1) is null
    Là encore, ça risque risque de mouliner 2 fois au lieu d'une, non ?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 406
    Points
    28 406
    Par défaut
    Ce n'est pas plutôt ça que tu cherches à faire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE ma_table t
    SET (champ_1, champ_2) =
      (SELECT val_1, val_2 FROM autre_table x WHERE x.lien_t=t.lien_x)
    WHERE t.ID=1

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Points : 328
    Points
    328
    Par défaut
    Désolé, j'aurais du préciser : j'ai mis le t.ID=1 pour faire mes tests et ne mettre à jour qu'une seule ligne...ce qui a révélé mon 2ème soucis.
    Je reformule donc. Si je prends :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE ma_table t
    SET (champ_1, champ_2) =
      (SELECT val_1, val_2 FROM autre_table x WHERE x.lien_t=t.lien_x)
    champ_1 et champ_2 sont mis à NULL pour toute les lignes où il n'y a pas de correspondance x.lien_t=t.lien_x.

    Moi évidemment, j'aimerais ne mettre à jour que les lignes où x.lien_t=t.lien_x. Là encore, ce n'est qu'un exemple, ma requête est bien plus complexe et très coûteuse, d'où ma tentative de l'alléger un maximum.

  6. #6
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    utilisez une clause exists :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...
    where exists (SELECT 1 FROM autre_table x WHERE x.lien_t=t.lien_x)
    Bon courage

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Points : 328
    Points
    328
    Par défaut
    Citation Envoyé par Yanika_bzh
    utilisez une clause exists
    En fait, c'est ce que j'ai fait (après une petite reflexion) afin d'utiliser 2 fois exactement la même requête dans l'espoir que le SGBD ne la fasse tourner qu'une seule fois.

    Mais non, l'EXPLAIN PLAN semble montrer que la requête tourne 2 fois...Du coup la mise à jour est extrêment longue.

    J'ai peut-être une idée pour m'en sortir, mais du coup, nouvelle question : si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update ma_table t
    set mon_champ=
    (select valeur from autre_table x inner join ma_table t on ...)
    est-ce que ma_table t de la sous-requête est la même que ma_table t du UPDATE ??

Discussions similaires

  1. Mettre à jour un champ avec une Liste déroulante
    Par Narutosaad dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/08/2010, 12h18
  2. Mettre à jour 1 champ avec un compteur
    Par Mvu dans le forum ASP
    Réponses: 2
    Dernier message: 18/12/2008, 23h09
  3. mettre à jour plusieurs tables avec un formulaire
    Par kangourou_agile dans le forum Access
    Réponses: 6
    Dernier message: 07/08/2006, 15h33
  4. Réponses: 3
    Dernier message: 09/07/2004, 10h23

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