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
    Futur Membre du Club
    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
    Expert éminent
    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
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  3. #3
    Membre averti
    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é
    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

    Un gros +1 pour le MERGE qui est souvent bien plus performant que l'UPDATE dans ces mises à jour entre tables.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  6. #6
    Futur Membre du Club
    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)