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 :

sql mettre à jour d'une table à partir d'une autre table


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut sql mettre à jour d'une table à partir d'une autre table
    Bonjour tout le monde,
    Quelqu’un pourrait-il m’aider pour développer la requête suivante :
    J’ai deux tables : tab1 et tab2 qui ont la même structure (clés et champs)
    Tab1(clé1,clé2, champ1, champ2 …)
    Tab2(clé1,clé2, champ1, champ2 …)
    Je cherche à mettre à jour des champs de tab2 à partir de tab1, le but de la requête est :
    Si une ligne dans la table tab1 existe dans la table tab2 alors
    Mettre à jour trois champs de la table tab2 avec les valeurs de ces mêmes champs à partir de tab1.
    J’ai essayé cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      UPDATE tab2 B, tab1 A 
      SET   B.champ1 = A.champ1,
    		B.champ1 = A.champ1,
    		B.champ1 = A.champ1,	
    where  
       and A.cle1 = B.cle1
       and A.cle2 = B.cle2
       AND (A.cle1 ,A.cle2) IN ( SELECT B.cle1 ,B.cle2
    			FROM tab2 B
     
    			)
    je ne suis pas sûr si la requête est correcte

    merci d'avance

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    je ne suis pas sûr si la requête est correcte
    As tu testé cette requête ? parce que si oracle te renvoie un message d'erreur c'est déjà une bonne piste

    Pour ton besoin il est plus simple d'utiliser MERGE si tu es en 10G+ (quelle est la version d'oracle ?)
    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    merge into tab2 b
    using tab1 a
       on (b.cle1 = a.cle1 and b.cle2 = a.cle2)
     when matched then
      set b.c1 = a.c1,
          b.c2 = a.c2,
          b.c3 = a.c3

  3. #3
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut
    ce ma parait une bonne solution, sauf que ma version d'oracle est 9.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Dommage, alors comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    update tab2 b
       SET (b.c1, b.c2, b.c3) = (select a.c1, a.c2, a.c3 from tab2 a where a.cle1 = b.cle1 AND a.cle2 = b.cle2)
     where exists (select 1 
                     from tab2 a
                    where a.cle1 = b.cle1 
                      AND a.cle2 = b.cle2)
    Ou la version rarement utilisé à base d'INLINE VIEW que je maîtrise mal, mais qui sera plus performante car on ne passe qu'une fois sur tab1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    update (select b.c1,b.c2,b.c3,a.c1,a.c2,a.c3
              from tab2 b
              join tab1 a on b.cle1 = a.cle1 and b.cle2 = a.cle2)
       set b.c1 = a.c1,
           b.c2 = a.c2,
           b.c3 = a.c3

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Pour ton besoin il est plus simple d'utiliser MERGE si tu es en 10G+
    Pas de souci, le MERGE existe parfaitement en V9 !

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Oui mais en 9i il faut impérativement utiliser la clause when not matched qui empêche MERGE d'être utilisé en remplacement d'UPDATE, mais il est vrai que ça ne génera peut être pas hammag

  7. #7
    Membre éclairé Avatar de hammag
    Profil pro
    Inscrit en
    Février 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 511
    Par défaut
    ce que je comprends de ton post skuatamad, c'est qu'il faut utiliser le when not matched sous oracle 9i ?

  8. #8
    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
    Oui c'est ça, mais pour être sûr de ne faire que des UPDATE, on joue avec le USING :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     MERGE INTO tab2 b
     USING (select d.*  -- à remplacer par vos colonnes
              from tab1 d
             where exists (select null from tab2 c
                            where c.cle1 = d.cle1
                              and c.cle2 = d.cle2)) a
        ON (b.cle1 = a.cle1 AND b.cle2 = a.cle2)
      WHEN MATCHED THEN UPDATE
       SET b.c1 = a.c1
         , b.c2 = a.c2
         , b.c3 = a.c3
      WHEN NOT MATCHED THEN
    INSERT (cle1)
    VALUES (null);

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/10/2014, 17h51
  2. Réponses: 2
    Dernier message: 23/04/2012, 17h23
  3. Update d'une table à partir de deux autres tables
    Par Peewee766 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 04/05/2008, 19h08
  4. Réponses: 4
    Dernier message: 20/03/2007, 09h54
  5. creer une autre table à partir d'une requete
    Par papou34 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/02/2007, 22h42

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