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 :

Petit défi SQL (Update avec condition)


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 233
    Par défaut Petit défi SQL (Update avec condition)
    Bonjour,

    J'ai ma table TABLE1 et TABLE2.
    Je souhaiterai une mise à jour de sorte que en fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Update TABLE1.var1 = 'test1' 
    Where TABLE1.var2 = left(TABLE2.var2,6)
    -- sinon 
    table1.var1='test2'
    La jointure est 'inner join'.
    Bref, je voulais savoir si c'était possible svp.

    merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il y a maintes façons de le faire. En voici une en deux passes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE TABLE1
    SET var1 = 'test1' 
    WHERE EXISTS (select null from TABLE2
                  where TABLE1.var2 = LEFT(TABLE2.var2,6));
     
    UPDATE TABLE1
    SET var1 = 'test2' 
    WHERE NOT EXISTS (select null from TABLE2
                      where TABLE1.var2 = LEFT(TABLE2.var2,6));

  3. #3
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Je me permets d'abord une petite remarque sur la syntaxe. C'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE UneTable
    SET UneColonne = 'xxx'
    WHERE ..
    Pour la suite, je reformule pour être sûr d'avoir compris : si on trouve une ligne dans table2 correspondant au critère de jointure, on update à test1, sinon à test2

    Dans ce cas, ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE Table1 a
    SET a.var1 = COALESCE((SELECT 'Test1' 
                        FROM Table2 b 
                        WHERE a.var2 = LEFT(b.var2, 6)), 'Test2')
    En gros, l'astuce est (du moins sous Oracle, après je ne sais pas à quel point c'est logique et normé d'un point de vue SQL), lorsque tu demandes à récupérer une valeur par de cette manière, on te renvoie NULL lorsqu'il n'y a pas de correspondance.
    Et COALESCE te renvoie test2 lorsque le premier argument est NULL.

    Par contre, il faut que ta jointure te renvoie au plus une valeur...

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 233
    Par défaut ...
    D'accord, je crois bien comprendre le truc.

    Par contre c'est possible de faire une requête dans la mis à jour de la colonne?

    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE TABLE1
    SET col1 = (select col3 from Table3 where TABLE2.col3 = LEFT(TABLE3.col3))
    WHERE TABLE1.col2 = LEFT(TABLE2.col2,6));

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 233
    Par défaut ...
    Je suis peut être mal exprimé...
    En fait je souhaite parcourir et mettre à jour val1 en mettant la valeur d'une autre table...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE TABLE1
    SET val1 = (SELECT val3 FROM Table2 WHERE TABLE1.val2 = LEFT(TABLE2.val2))
    WHERE TABLE1.val2 = LEFT(Select val2 FROM TABLE2));
    ça marcherait ça?

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    En fait, la dernière partie de ta requête ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE TABLE1.val2 = LEFT(SELECT val2 FROM TABLE2));
    => c'est une jointure entre table1 et table2 qu'il te faut.

    Quel est ton SGBD ?
    Selon ta réponse, tu peux avoir droit à l'update de jointure qui serait la solution idéale dans ton cas.

    Sinon, il faut que tu combines ta requête avec la méthode de Waldar : EXISTS te permet de ne mettre à jour que les lignes pour lesquelles il y a correspondance dans Table2.

    J'en profite pour reposer la question que j'ai posé récemment sur un autre sujet (SQLPro, par exemple ?) :
    La syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE Table1, Table2 
    SET ...
    WHERE
    Est-elle dans une quelconque norme SQL ?

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    J'en profite pour reposer la question que j'ai posé récemment sur un autre sujet (SQLPro, par exemple ?) :
    La syntaxe
    UPDATE Table1, Table2
    SET ...
    WHERE

    Est-elle dans une quelconque norme SQL ?
    Bien sur que non ! Les commandes de mise à jour SQL ne concernent jamais qu'une seule table à la fois et lorsque plusieurs commandes sont à regroupé dans uneunité logique en tout ou rien la solution est la transaction.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/09/2006, 18h28
  2. [SQL] update avec decode
    Par jojo22222 dans le forum Oracle
    Réponses: 8
    Dernier message: 04/01/2006, 17h50
  3. update avec condition sur autre table
    Par allowen dans le forum Langage SQL
    Réponses: 5
    Dernier message: 01/04/2005, 15h02
  4. UPDATE avec condition sur d'autres tables
    Par guda dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/03/2005, 11h20
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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