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 avec jointure : des évolutions ?


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Update avec jointure : des évolutions ?
    Bonjour,

    Je travaille sous Oracle 10.1.0.5.0

    J'ai une table "pro" dont la clé est "codsoc, codpro".
    J'ai une seconde table "prm" dont la clé est "codsoc, codpro, codlan".

    J'ai modifié en masse la table "prm". J'ai modifié ces champs "datmod et utimod" avec la date du jour et mon nom afin d'avoir une trace de qui a modifié ces libellés de produits.

    Maintenant, je désire mettre à jour la table "pro" avec le même datmod et utimod pour toutes les lignes que j'ai modifié dans "prm" (en reprenant la liaison sur codsoc, codpro).

    Voici la requête que j'ai écrit (qui fonctionne) :
    Code : 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
     
    update pro
    set (datmod, utimod) = 
    (
       select prm.datmod, prm.utimod
       from prm
       where prm.codsoc = 100
       and prm.codlan = 'ITA'
       and prm.tradesig4 = 'IVA21'
       and prm.codpro = pro.codpro
    )
    where (codsoc, codpro) in 
    (
       select prm.codsoc, prm.codpro 
       from prm
       where prm.codsoc = 100
       and prm.codlan = 'ITA'
       and prm.tradesig4 = 'IVA21'
    );
    (codsoc = 100, codlan = 'ITA' et prm.tradesig4 = 'IVA21' permettant de retrouver les lignes que j'ai modifié).

    Comme on voit, on retrouve deux fois plus ou moins la même sous-requête. Outre le problème de performances, cette écriture est particulièrement crade.

    Existe-t-il une syntaxe plus propre ?

    SQL Server permet notamment les jointures sur les update, ce qui rend l'écriture de telles requêtes de mise à jour plus simple.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    très bon article ici : http://lnavarro.developpez.com/oracle/updatemerge/

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Merci pour l'astuce du MERGE.

    Même si je suis pas fan de sa syntaxe, je vais tenter de me familiariser avec, c'est toujours mieux que la bouse que j'utilise habituellement

    Ce serait quand même plus pratique si la jointure était supportée

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    ...
    Ce serait quand même plus pratique si la jointure était supportée
    En fait elle est supportée depuis Oracle 7.3

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Avec quelle syntaxe ?

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Je connais cette syntaxe aussi, mais c'est limite si elle est pas pire que les deux autres réunie...

    Code : 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
     
    begin
      for r in (
        select <id>,
               substr(prm.tradesig2, 1, 30) as new_nompro,
               tradesig3 as new_tradesig1
        from prm, pro
        where prm.codsoc = 3
        and prm.codlan in ('MAG', 'ENG')
        and pro.codsoc = prm.codsoc
        and pro.codpro = prm.codpro 
        and pro.sigfou = 'CADES'
      )
      loop
        update prm
        set nompro = r.new_nompro,
            tradesig1 = r.new_tradesig1
        where <id> = r.<id>;
      end loop;
    end;
    (une vieille requête que j'ai retrouvé sur un autre forum, que j'avais posté en 2005)

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

Discussions similaires

  1. UPDATE avec jointure
    Par warning dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 13/12/2007, 10h35
  2. Requête UPDATE avec jointure
    Par petburn dans le forum SQL
    Réponses: 7
    Dernier message: 30/07/2007, 14h22
  3. [UPDATE] avec jointure sur une requete
    Par userB dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/07/2007, 16h18
  4. 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
  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