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

Oracle Discussion :

[PL/SQL] update avec jointure


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 22
    Points
    22
    Par défaut [PL/SQL] update avec jointure
    Bonjour

    J'ai besoin d'optimiser un update en PL/SQL.
    J'ai deux tables TABLE1 et TABLE2 qui possède la meme structure qui est la suivante : CLE, CHAMP1 et CHAMP2
    Le but de de mettre à jour la table TABLE1 avec la table TABLE2 en fonction du champ CLE.

    Voici la requete qui fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      update TABLE1 a
      set
        a.CHAMP1 = (select CHAMP1 from TABLE2 where CLE = a.CLE),
        a.CHAMP2 = (select CHAMP2 from TABLE2 where CLE = a.CLE)
      where (a.CLE in (select CLE from TABLE2);
    Le problème est qu'elle est lente, surement à cause des multiples select.
    Je me rappelle d'une facon de coder cela en TRANSAC-SQL et qui serait surement plus rapide, mais qui ne marche pas en PL/SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      update TABLE1
      set
        a.CHAMP1 = b.CHAMP1,
        a.CHAMP2 = b.CHAMP2
      from TABLE1 a, TABLE2 b	
      where (a.CLE = b.CLE)
    Serait-il possible de faire un update similaire en PL/SQL

    Merci pour vos réponses

    Fox

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Dans un premier temps tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      update TABLE1 a 
      set 
        (a.CHAMP1, a.CHAMP2) = (
           select CHAMP1, CHAMP2 
           from TABLE2 where CLE = a.CLE
        )
      where (a.CLE in (select CLE from TABLE2);

    Puis ensuite tenter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      update (select a.cle, a.champ1, a.champ2, b.champ1 new_champ1, b.champ2 new_champ2 from TABLE1 a, TABLE2 b where a.cle = b.cle)
      set champ1 = new_champ1, champ2 = new_champ2
    Mais je te garantis pas que ca marche, il y a certaines contraintes pour que ca fonctionne que je ne maitrise pas.


    Laly.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Merci beaucoup.

    Je gagne 75% en durée avec la première mouture.

    Je me suis abstenu d'essayer la deuxième mouture car 75% me suffisent.

    Fox

  4. #4
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    A mon avis tu peux essayer la seconde

    La première avec le IN risque d'être très gourmande en ressource. Tu parcours une fois la table TABLE2 pour récupérer les CLE intéressantes et ensuite TABLE1 pour faire la maj.

    Avec la seconde tu parcours TABLE1 et tu accèdes conjointement à TABLE2 (tu as un index sur CLE ?) pour récupérer les enregistrements.

    Ca vaut le cout d'essayer...


    Laly.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Oui j'ai un index sur cle

    Fox

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    ok, j'ai essayé et cela aurait peut-etre fonctionné si CLE était une clé primaire mais ce n'est pas le cas et le message d'erreur est le suivant :

    ORA-01779: cannot modify a column which maps to a non key-preserved table

    mais je me souviendrais quand même de cette deuxième mouture pour une prochaine fois.

    Merci encore

    Fox

  7. #7
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    ORA-01779: cannot modify a column which maps to a non key-preserved table
    Cause: An attempt was made to insert or update columns of a join view which map to a non-key-preserved table.
    Action: Modify the underlying base tables directly.
    OK, dommage.


    Laly.

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

Discussions similaires

  1. [SQL SERVER 2000] UPDATE avec jointure
    Par Jsh dans le forum Développement
    Réponses: 2
    Dernier message: 23/01/2009, 10h08
  2. Requete update avec jointure d'une requête
    Par bart64 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 28/05/2007, 20h31
  3. [SQL]Problème avec jointure de tables
    Par benjisan dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 29/03/2007, 20h43
  4. Réponses: 4
    Dernier message: 26/09/2006, 18h28
  5. [SQL] update avec decode
    Par jojo22222 dans le forum Oracle
    Réponses: 8
    Dernier message: 04/01/2006, 17h50

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