J'ai écrit une requête pour échanger les valeurs de ligne dans la même table en fonction des conditions dans plusieurs tables

UPDATE LV_MESSWERT a1
SET a1.WERT_N = (
    SELECT mw.WERT_N
    FROM   LV_MPRG mp1, LV_PK   pk, LV_PKL pkl, VIEW_DEF3_MESSUNG mess, LV_MESSWERT mw, LV_DLOBJ dl, OSI_OBJ ob, LV_ABBRUCH ab 
    WHERE  (mp1.DEFMES_ID = mess.DEF_MESS_ID AND
          mp1.MPRG_ID = pk.MPRG_ID AND
          pk.PKL_ID = pkl.PKL_ID AND
             pk.PK_ID = mw.PK_ID AND
             mw.DLOBJ_ID = dl.DLOBJ_ID AND
             dl.obj_id = ob.obj_id AND
       mw.MW_ID = a1.MW_ID AND
       mw.SP = a1.sp AND
       ob.KENN = 'DUMMY1' AND
             pk.pk_id = ab.pk_id (+)) AND
            (mp1.POBJ_ID = :pn_pobj AND
             pk.mess_merk = '1'))  where a1.MW_ID in (SELECT mw.MW_ID
    FROM   LV_MPRG mp, LV_PK    pk, LV_PKL pkl, VIEW_DEF3_MESSUNG mess, LV_MESSWERT mw, LV_DLOBJ dl, OSI_OBJ ob, LV_ABBRUCH ab 
    WHERE  (mp.DEFMES_ID = mess.DEF_MESS_ID AND
          mp.MPRG_ID = pk.MPRG_ID AND
          pk.PKL_ID = pkl.PKL_ID AND
             pk.PK_ID = mw.PK_ID AND
             mw.DLOBJ_ID = dl.DLOBJ_ID AND
             dl.obj_id = ob.obj_id AND
       mw.MW_ID = a1.MW_ID AND
       mw.SP = a1.sp AND
       ob.KENN = 'DUMMY3' AND
             pk.pk_id = ab.pk_id (+)) AND
            (mp.POBJ_ID = :pn_pobj AND
             pk.mess_merk = '1'));

Le problème ici est sa mise à jour des valeurs mais en écrivant NULL au lieu de la valeur. Peut-être que quelqu'un peut m'aider avec cette requête. Qu'est-ce que je rate ? donc je veux que toutes les valeurs de 'WERT_N' dans DUMMY_1 soient échangées avec WERT_N dans l'objet DUMMY_3.

0
user3802070 19 oct. 2020 à 19:33

1 réponse

Meilleure réponse

Votre relevé update n'a pas de clause where. Cela signifie qu'il mettra à jour chaque ligne dans LV_MESSWERT. Si votre sous-requête ne renvoie pas de valeur, la ligne LV_MESSWERT correspondante sera mise à jour en null.

Si vous souhaitez uniquement mettre à jour les lignes où la sous-requête renvoie une ligne, vous devez ajouter une clause where

update LV_MESSWERT a1
   set a1.WERT_N = (<<your subquery>>)
 where exists( <<your subquery>> )
1
Justin Cave 19 oct. 2020 à 16:41