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 sur plusieurs tables


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Points : 61
    Points
    61
    Par défaut Update avec jointure sur plusieurs tables
    Bonjour,

    Je ne comprends pas pkoi mon update ne passe pas.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update pldem, bidos, zjna
    set pldem.caint_num = zjna.caint_num, pldem.paesi_num = zjna.paesi_num
    where pldem.bidos_num = bidos.bidos_num
    and bidos.totie_cod = zjna.totie_cod
    and bidos.biact_cod = 'GRT'
    L'erreur remontée par SQL Developper est
    Erreur SQL : ORA-00971: mot-clé SET absent
    00971. 00000 - "missing SET keyword"

    J'en déduis que je n'ai pas le droit de mettre plusieurs tables derrière mon update?!?

    Merci pour vos retours.
    Cordialement,
    Julien

  2. #2
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Salut

    Il faut utiliser les INNER JOIN

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update t1 inner join t2 on t1.c0 = t2.c0
    set t1.c1 = 10, t2.c1 = 10;

  3. #3
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    J'ai modifié mon code ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update pldem 
    inner join bidos on pldem.bidos_num = bidos.bidos_num
    inner join zjna on bidos.totie_cod = zjna.totie_cod
    set pldem.caint_num = zjna.caint_num, pldem.paesi_num = zjna.paesi_num
    where bidos.biact_cod = 'GRT'
    Le message est exactement le même, il bloque sur la première ligne.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    La syntaxe UPDATE ... JOIN n'est pas prise en charge par Oracle et n'est pas conforme à la norme du langage SQL non plus.
    La manière la plus simple de faire ce genre d'opération est d'utliser la commande MERGE.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Points : 61
    Points
    61
    Par défaut
    Ma première syntaxe est donc fausse?

    --> je viens de regarder la fonction merge. Je ne comprends pas comment la transposer à mon cas

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    306
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 306
    Points : 71
    Points
    71
    Par défaut
    Désolé je n'avais pas vu que c'était pour Oracle.
    Je ne sais pas alors.
    Mes excuses ...

  7. #7
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Points : 61
    Points
    61
    Par défaut merge
    Voila comment je l'ai écrite mais ca ne passe pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    merge into pldem
    using bidos, zjna
    on pldem.bidos_num = bidos.bidos_num, bidos.totie_cod = zjna.totie_cod
    when matched then update set pldem.caint_num = zjna.caint_num, pldem.paesi_num = zjna.paesi_num
    Apparemment ca bloque parce que j'utilise deux table dans le "using".
    Je n'ai pas le droit?

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pas d'accord pour le MERGE, pour moi la méthode principale reste l'UPDATE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE PLDEM
    set (caint_num, paesi_num) = (SELECT zjna.caint_num, zjna.paesi_num
    		FROM BIDOS, ZJNA
    		WHERE pldem.bidos_num = bidos.bidos_num
    		AND bidos.totie_cod = zjna.totie_cod
    		AND bidos.biact_cod = 'GRT')
    WHERE EXISTS (SELECT 1 FROM BIDOS, ZJNA
                  WHERE pldem.bidos_num = bidos.bidos_num
                  AND bidos.totie_cod = zjna.totie_cod
                  AND bidos.biact_cod = 'GRT'
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    La syntaxe correcte avec le MERGE est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     merge into pldem tgt
     using (select t2.caint_num
                 , t2.paesi_num
              from bidos t1
              join zjna  t2
                on t2.totie_cod = t1.totie_cod
             where t1.biact_cod = 'GRT') src
        on (src.bidos_num = tgt.bidos_num)
      when matched then update
       set tgt.caint_num = src.caint_num
         , tgt.paesi_num = src.paesi_num;
    Citation Envoyé par McM Voir le message
    Pas d'accord pour le MERGE, pour moi la méthode principale reste l'UPDATE.
    Il faut toujours comparer les plans d'exécution et ne pas tirer de conclusion hâtive mais de mon expérience personnelle dans des environnements de type DWH, MERGE est plus rapide.

  10. #10
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par McM Voir le message
    Pas d'accord pour le MERGE, pour moi la méthode principale reste l'UPDATE.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE PLDEM
    set (caint_num, paesi_num) = (SELECT zjna.caint_num, zjna.paesi_num
    		FROM BIDOS, ZJNA
    		WHERE pldem.bidos_num = bidos.bidos_num
    		AND bidos.totie_cod = zjna.totie_cod
    		AND bidos.biact_cod = 'GRT')
    WHERE EXISTS (SELECT 1 FROM BIDOS, ZJNA
                  WHERE pldem.bidos_num = bidos.bidos_num
                  AND bidos.totie_cod = zjna.totie_cod
                  AND bidos.biact_cod = 'GRT'
    Bonsoir,

    Merci beaucoup, ca a l'air de fonctionner meme si la requete tourne toujours car il y a 230 000 lignes à MAJ.
    Mais juste pour ma culture, à quoi sert le where exists? Je ne comprends pas son utilité.

    Merci encore et bonne soirée

  11. #11
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    124
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 124
    Points : 61
    Points
    61
    Par défaut
    Alors finalement j'ai abandonné l'update au bout de 850 secondes.
    J'ai lancé le merge (auquel il manquait juste le T1.bidos_num dans le select du using) et la hop en 15 sec c'était fini.

    Quoiqu'il en soit merci à tous les deux pour votre aide précieuse.
    J'ai appris beaucoup de chose aujourd'hui.

  12. #12
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    La syntaxe UPDATE ... JOIN n'est pas prise en charge par Oracle....
    Mais si voir Updating a Join View
    A lire également Updatable Join Views.

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

Discussions similaires

  1. Requete SQL avec jointure sur trois tables
    Par pit2121 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/05/2008, 23h07
  2. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 20h24
  3. hibernate-criteria : jointure sur plusieurs tables
    Par loic72 dans le forum Hibernate
    Réponses: 9
    Dernier message: 24/09/2007, 17h27
  4. [UPDATE] avec jointure sur une requete
    Par userB dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/07/2007, 16h18
  5. update avec condition sur autre table
    Par allowen dans le forum Langage SQL
    Réponses: 5
    Dernier message: 01/04/2005, 15h02

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