Oracle:複数のテーブルの更新=> ORA-01779:非キー保存テーブルにマップするカラムを変更できません

私はテーブル間の結合を作った。私は単にいくつかのデータから値を取り出し、他の列に入れたいだけです。しかし、それは動作しません。 どのようにクエリを書き直すことができますか? 私はswkfからの値でwkfcテーブルの値を上書きしたいと思います。

私はそれが正しいことを知っています。どうすればOracleが単にそれを行うことができますか?

UPDATE (
SELECT --FROM
       swkf.swkf_stato_workflow_id "swkf_swkf_stato_workflow_id", 
       swkf.swkf_data_ini "swkf_swkf_data_ini",
       swkf.swkf_versione "swkf_swkf_versione",
       swkf.spwkf_stato_pubblico_id "swkf_spwkf_stato_pubblico_id",
       swkf.spwkf_data_ini "swkf_spwkf_data_ini",
       swkf.spwkf_versione "swkf_spwkf_versione",
       --TO
       wkfc.swkf_stato_workflow_id "wkfc_swkf_stato_workflow_id", 
       wkfc.swkf_data_ini "wkfc_swkf_data_ini",
       wkfc.swkf_versione "wkfc_swkf_versione",
       wkfc.spwkf_stato_pubblico_id "wkfc_spwkf_stato_pubblico_id",
       wkfc.spwkf_data_ini "wkfc_spwkf_data_ini",
       wkfc.spwkf_versione "wkfc_spwkf_versione"
       --
  FROM wkfb_stati_workflow swkf, wkf_cronologia wkfc
 WHERE twkf_tipo_workflow_id =
          (SELECT twkf_tipo_workflow_id
             FROM wkf_istanze_workflow wkfi, RET_PUNTI_EROGAZIONE RPUN
            WHERE     RPUN.PUN_PUNTO_EROGAZIONE_COD = '8001375567' --codice puntero
                  AND RPUN.PUN_PUNTO_EROGAZIONE_ID = wkfi.ogg_oggetto_id
                  AND wkfi.tog_tipo_oggetto_id = 'RET_PUN1'
                  AND wkfi.WKFI_FLAG_ANN = 'N')
       AND swkf_descrizione = '(O)Occupato'
       AND wkfc.wkfc_cronologia_id = 'ApAJ0qCudNphjLxj'
  )  a1
set 
"wkfc_swkf_stato_workflow_id" =  "swkf_swkf_stato_workflow_id" ,
"wkfc_swkf_data_ini" =           "swkf_swkf_data_ini" ,
"wkfc_swkf_versione" =           "swkf_swkf_versione"  ,
"wkfc_spwkf_stato_pubblico_id" = "swkf_spwkf_stato_pubblico_id" , 
"wkfc_spwkf_data_ini" =          "swkf_spwkf_data_ini" ,
"wkfc_spwkf_versione" =          "swkf_spwkf_versione"  ;

それは以下のようにすることと同じですが、値だけを見つけなければなりません。

UPDATE wkf_cronologia
   SET swkf_stato_workflow_id = 'o3gE1tlSdcDIC6FF',
       swkf_data_ini = TO_TIMESTAMP ('19-06-2010 18:28:10,556000000','DD-MM-RRRR HH24:MI:SS,FF'),
       swkf_versione = 0, 
       SPWKF_STATO_PUBBLICO_ID = '*1UNICOO',
       SPWKF_DATA_INI = TO_TIMESTAMP ('01-01-0001 00:00:00,000000000', 'DD-MM-RRRR HH24:MI:SS,FF'),
       SPWKF_VERSIONE = 0
 WHERE wkfc_cronologia_id = 'ApAJ0qCudNphjLxj';  --id del record di cronologia da aggiornare (estratto nella prima query)
2
彼らはそうではありません。私はswkfから一意の値を取得し、wkf_cronologiaを更新するためにそれらを使用する必要があります。最善の方法は?
追加された 著者 Revious,
私はあなたのテーブルの間にどんな結合基準も見ません。テーブルwkfb_stati_workflow、wkf_cronologia、wkf_istanze_workflow、およびRET_PUNTI_EROGAZIONEはどのように関連していますか?
追加された 著者 Bob Jarvis,

2 答え

結合条件は、Bの一意性制約のすべての列を単一の値に制限する必要があります( UPDATE(SELECT ... IN IN JOIN B ON条件から選択します)SET AX = ...

3
追加された

まず、結合ビューによる単一の問合せを使用して2つの表を更新することはできません。この場合、DBプロシージャを選択できます。

 ORA-01776: cannot modify more than one base table through a join view
   01776. 00000 -  "cannot modify more than one base table through a join view"
   *Cause:    Columns belonging to more than one underlying table were either
         inserted into or updated. 

しかし、joinを使用して基本表と参照表を比較し、1つの表を更新できます。

UPDATE
(
    SELECT t1.d1 x, t2.d1 y FROM t1, t2 WHERE t1.d2 = t2.d2 AND t2.d2 = 2
) t3

SET t3.x = 6;
 -- t3.y = 1; this is wrong updating multiple table

これで、この結合(t1.d2 = t2.d2)を一意の列で実行する必要があります。 ここでは両方のテーブルd2列が一意である必要があります。

それ以外の場合は下になります

 Oracle: multiple table updates => ORA-01779: 
 cannot modify a column which maps to a non key-preserved table


Below URL explains how to perform this join on non unique columns

Oracle - 更新結合 - 非キー保存テーブル

3
追加された