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

SQL Oracle Discussion :

UPDATE d'une table à partir d'une autre


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Par défaut UPDATE d'une table à partir d'une autre
    Bonjour,
    Voilà ce que j'aimerais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update t1
    set t1.valeur = ( select t2.nom from t2 where t2.identifiant=t1.identifiant
                           and t2.col = t1.col)
    ;
    Mais, ça retourne plusieurs valeurs.
    Je pense qu'il faut ajouter une clause "WHERE EXISTS", mais je ne me rappelle plus de l'ordre exact.

    Merci d'avance.

  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

  3. #3
    Membre éprouvé
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    D'abord, avec ta requete, telle qu elle est ecrite, tu mets a jour toutes les lignes de t1. Donc tu peux ajouter des clauses sur l update de t1 comme pour un select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    update t1
    set t1.valeur = ( select t2.nom from t2 where t2.identifiant=t1.identifiant
    and t2.col = t1.col)
    Where exists (select 1 from t2 where t2.identifiant=t1.identifiant
    and t2.col = t1.col)
    and t1.valeur is null ...
    ;
    Ensuite, il faut t assuerer que pour la requete select sur t2 ne renvoit bien qu'une seule ligne pour chaque couple identifiant/col de t1

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 92
    Par défaut
    Merci beaucoup.

    mais, je ne comprends pas la dernière condition
    "and t1.valeur is null"

    Elle sert à quoi

  5. #5
    Membre éprouvé
    Inscrit en
    Septembre 2008
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 101
    Par défaut
    La derniere condition "and t1.valeur is null" ne te sert a rien, c est juste pour montrer qu on peut mettre autant de conditions que nécessaire

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Par défaut
    Si la sous-requête renvoie plusieurs lignes , le EXISTS ne changera rien au problème, il faut une condition plus restrictive dans cette sous-requête.

  7. #7
    Membre averti
    Inscrit en
    Septembre 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 17
    Par défaut
    l'instruction update ne permet pas de faire :

    update table1 set col1=(select col2 from table2 where .... --si la sous requte retourne plusieurs valeurs)
    puisque c'est insensé une colonne ne peux avoir qu'une seule valeur à la fois,
    si la sous requete retourne la meme valeur en plusieurs lignes vous pouvez ajouter un distinct ou rownum :


    update table1 set col1=(select col2 from table2 where .... and rownum<2)

    update table1 set col1=(select distinct col2 from table2 where ....)
    pour renvoyer une seule valeurs

    pour la clause exist ca changera rien au probleme puisque elle ne sert qu'a arreter la recherche dans la sous requete interne s'elle renvoie au moins une ligne

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2012, 12h12
  2. SQL Update d'une table à partir d'une autre table
    Par Jean-Marc68 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/03/2007, 13h22
  3. [D7],[Access], update d'une table à partir d'une autre
    Par iam dans le forum Bases de données
    Réponses: 4
    Dernier message: 06/11/2006, 18h14
  4. Update d'une table à partir d'une autre
    Par nicoaix dans le forum Access
    Réponses: 5
    Dernier message: 09/03/2006, 11h36
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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