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 :

Compréhension sur UPDATE avec SELECT


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut Compréhension sur UPDATE avec SELECT
    Bonjour,


    Je cherche à mettre à jour le champ d'une table en m'appuyant sur une autre table (importée depuis texte). A l'évidence mon SELECT est mal construit car il me remonte plus d'un enregistrement.

    Résultat souhaité : vérifier l'égalité entre les champs des deux tables et si ça match, réutiliser le résultat du SELECT pour la commande UPDATE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -- LKLO est le champ en commun permettant la liaison entre les tables
    update klogemt k 
    set k.SURFCORR = (  select i.SURFCORR
                        from jl_import i, klogemt k
                        where i.LKLO = k.LKLO
                        );
    Malheureusement mon SELECT me remonte toutes les valeurs de JL_IMPORT.SURFCORR au lieu de remonter la valeur de la ligne correspondant à mon WHERE. C'est évident que je me suis mélanger les pinceaux mais je manque de connaissances pour identifier la cause.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    update klogemt k 
    set k.SURFCORR = (  select i.SURFCORR
                        from jl_import i
                        where i.LKLO = k.LKLO );
    Pour info : Un update comme ceci, tu peux (dois si tu es débutant) faire le SELECT correspondant pour vérifier ce que tu vas mettre à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT k.*, ( select i.SURFCORR from jl_import i where i.LKLO = k.LKLO ) new_surfcorr
    FROM klogemt k
    Comme ça tu peux vérifier tes lignes avec la donnée actuelle et celle que tu vas mettre

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 167
    Par défaut
    Bonjour,
    En effet il manque la clause WHERE qui fait le même lien (inutile de reprendre la table cible dans la sous-requête):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    update klogemt k 
    set k.SURFCORR = (select i.SURFCORR
                      from jl_import i
                      where i.LKLO = k.LKLO
                     )
    where exists (select null 
                  from  jl_import i
                  where i.LKLO = k.LKLO
                 );
    Cela dit pour ce genre de mise à jour il est souvent plus simple (et plus performant) d'utiliser l'instruction MERGE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    merge into klogemt k       
    using jl_import i
    on (i.LKLO = k.LKLO)
    when matched then update set k.SURFCORR = i.SURFCORR;

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Il faut utiliser une requête corrélée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    -- LKLO est le champ en commun permettant la liaison entre les tables
    update klogemt k 
    set k.SURFCORR = (select i.SURFCORR
                        from jl_import i
                        where i.LKLO = k.LKLO)
    where exists (select 1
                    from jl_import i
                   where i.LKLO = k.LKLO);
    J'ai rajouté un tests d'existence pour éviter de mettre à NULL la colonne SURFCORR si elle n'existe pas dans JL_IMPORT.

    Vous pouvez également utiliser MERGE

    [EDIT] Arf j'avais pas vu qu'il y avait déjà toutes les réponses nécessaires

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 132
    Par défaut
    Un gros +1 pour le MERGE qui est souvent bien plus performant que l'UPDATE dans ces mises à jour entre tables.
    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.

  6. #6
    Membre averti
    Inscrit en
    Octobre 2009
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 26
    Par défaut
    Dingue... ça à l'air si simple... à lire pas mal de doc et tuto sur le net je m'étais mélangé les pinceaux.

    Nickel je vais pouvoir m'appuyer sur ces nouveaux éléments de connaissances pour monter en compétences.

    Merci à tous pour le temps passé (et j'apprécie beaucoup vos réponses sur les multiples sujets que je consulte pour trouver mes réponses)

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

Discussions similaires

  1. Requete UPDATE avec SELECT sur 2 champs
    Par ngstudio dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/09/2009, 14h47
  2. Réponses: 3
    Dernier message: 09/01/2008, 15h54
  3. UPDATE avec SELECT sur la même table
    Par Invité dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/12/2007, 03h39
  4. Requete Update avec Select imbriqué: etrange resultat!
    Par corentone dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/08/2007, 15h05
  5. filtre sur liste avec selection multiple
    Par petitours dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 01/08/2007, 09h42

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