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 table1 from table2


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 23
    Par défaut update table1 from table2
    bonjour,

    j'utilisais regulierement sous ingres cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    update table1 a1
    from table1 a2
    set col2 = a2.col2,
          col3=a2.col3
    where a1.col1=a2.col1
    Celle-ci n'existe pas sous oracle

    j'ai trouvé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    update table1 a1
    set a1.col2 = ( select a2.col2 from table1 a2 where a1.col1=a2.col1),
         a1.col3 = ( select a2.col3 from table1 a2 where a1.col1=a2.col1)
    Y aurait-il une meilleure ecriture ? ( je suis sous oracle 9.2)

    Merci

  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
    C'est vraiment deux fois table1 que vous voulez ?
    J'imagine que non

    Vous pouvez faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE table1 a1
    SET (a1.col2, a1.col3) = (SELECT a2.col2, a2.col3 FROM table2 a2 WHERE a1.col1=a2.col1)
    WHERE EXISTS (SELECT null FROM table2 a2 WHERE a1.col1=a2.col1)

  3. #3
    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
    Vous pouvez utiliser MERGE aussi :
    10g et +

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    merge into table1 a1
    using table2 a2
      on (a1.col1=a2.col1)
    when matched then update
      set a1.col2 = a2.col2, a1.col3=a2.col3

    9i
    Cf. Ask Tom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    merge into table1 a1
    using (select * from table2 a2 where a2.col1 in (select col1 from table1))
      on (a1.col1=a2.col1)
    when matched then update
      set a1.col2 = a2.col2, a1.col3=a2.col3
    when not matched then insert
      (col1) values (null)

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Citation Envoyé par lesageelu Voir le message
    bonjour,

    j'utilisais regulierement sous ingres cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    update table1 a1
    from table1 a2
    set col2 = a2.col2,
          col3=a2.col3
    where a1.col1=a2.col1
    Celle-ci n'existe pas sous oracle

    j'ai trouvé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    update table1 a1
    set a1.col2 = ( select a2.col2 from table1 a2 where a1.col1=a2.col1),
         a1.col3 = ( select a2.col3 from table1 a2 where a1.col1=a2.col1)
    Y aurait-il une meilleure ecriture ? ( je suis sous oracle 9.2)

    Merci

    Salut,

    Ton premier update est incorrect, le deuxième tu updates toute ta table et tu scan deux fois ta table, je te suggère (si tu as deux tables table1 et table2)


    Avec le merge tu updates uniquement les colonnes qui verifient la condition
    (a1.col1 = a2.col1) .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MERGE INTO table1 a1
       USING table2 a2
       ON (a1.col1 = a2.col1)
       WHEN MATCHED THEN
          UPDATE
             SET a1.col2 = a2.col2, a1.col3 = a2.col3

  5. #5
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Citation Envoyé par salim11 Voir le message
    Salut,

    Ton premier update est incorrect, le deuxième tu updates toute ta table et tu scan deux fois ta table, je te suggère (si tu as deux tables table1 et table2)


    Avec le merge tu updates uniquement les colonnes qui verifient la condition
    (a1.col1 = a2.col1) .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MERGE INTO table1 a1
       USING table2 a2
       ON (a1.col1 = a2.col1)
       WHEN MATCHED THEN
          UPDATE
             SET a1.col2 = a2.col2, a1.col3 = a2.col3
    Il ne peut faire cette commande merge en 9I., helas

    La reponse de Waldar tiré de ASKTOM est plus adapté ... pour 9I

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Citation Envoyé par fatsora Voir le message
    Il ne peut faire cette commande merge en 9I., helas

    La reponse de Waldar tiré de ASKTOM est plus adapté ... pour 9I

    Salut Fatsora,

    Oui t'as entièrement raison, mauvaise habitude(j'utilise la 10g).

    la conclusion : Dans ce cas l'utilisation du merge est beaucoup mieux que le update

    Salim.

  7. #7
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Le MERGE 9i propose plus tot n'est une option que si il y a toujours un update (on est sur que la jointure retournera quelque chose), ou que un insert de null est tolere.

    Nicolas.

  8. #8
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Citation Envoyé par NGasparotto Voir le message
    Le MERGE 9i propose plus tot n'est une option que si il y a toujours un update (on est sur que la jointure retournera quelque chose), ou que un insert de null est tolere.

    Nicolas.
    Qu'est ce que tu veux dire par la ? ....

    Car a priori on ne veut mettre a jour que les COL1 qui existent dans le 2 tables

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    SQL> create table src (col1 number,col2 varchar2(5), col3 varchar2(20));
     
    Table crÚÚe.
     
    SQL> insert into src select '123' ,'TOTO','AAAAAA' from dual union
      2  select '234','TITI','IIIIIIIII' from dual union
      3  select '345','TATA','OOOOOOOOO' from dual union
      4  select '456','TUTU','UUUUUUUUU' from dual;
     
    4 ligne(s) crÚÚe(s).
     
    SQL> commit;
     
    Validation effectuÚe.
     
    SQL> create table tgt as select * from src;
     
    Table crÚÚe.
     
    SQL> update src set col2=null;
     
    4 ligne(s) mise(s) Ó jour.
     
    SQL> update src set col3=null;
     
    4 ligne(s) mise(s) Ó jour.
     
     
    SQL> alter table tgt add constraint pk_tgt primary key (col1) using index;
     
    Table modifiÚe.
     
     
      1  merge INTO tgt a1
      2  USING (SELECT col1,col2,col3 FROM src  WHERE src.col1 IN (SELECT col1 FROM tgt)) a2
      3    ON (a1.col1=a2.col1)
      4  when matched then UPDATE
      5    SET a1.col2 = a2.col2, a1.col3=a2.col3
      6  when NOT matched then INSERT
      7*   (col1) VALUES (NULL)
    SQL> /
     
    4 lignes fusionnÚes.
     
                                                VARCHAR2(20)
     
    SQL> delete from tgt;
     
    4 ligne(s) supprimÚe(s).
     
     
     
      1  merge INTO tgt a1
      2  USING (SELECT * FROM src  WHERE src.col1 IN (SELECT col1 FROM tgt))a2
      3    ON (a1.col1=a2.col1)
      4  when matched then UPDATE
      5    SET a1.col2 = a2.col2, a1.col3=a2.col3
      6  when NOT matched then INSERT
      7*   (col1) VALUES (NULL)
    SQL> /
     
    0 lignes fusionnÚes.
     
    SQL>

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

Discussions similaires

  1. Requette Update Table1 depuis Table2
    Par kof_eve dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/11/2012, 10h24
  2. update Table1 from select table2
    Par olibara dans le forum MS SQL Server
    Réponses: 15
    Dernier message: 10/05/2011, 12h35
  3. UPDATE TABLE1, TABLE2
    Par Daftman dans le forum Débuter
    Réponses: 2
    Dernier message: 22/03/2011, 10h59
  4. Table1 moins Table2
    Par helenafr dans le forum Access
    Réponses: 13
    Dernier message: 28/04/2006, 15h52
  5. Copier données de table1 vers table2 dans paradox
    Par marcus333 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/03/2006, 18h05

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