Oracle: несколько обновлений таблицы => ORA-01779: невозможно изменить столбец, который сопоставляется с таблицей, не содержащей ключей

Я сделал соединение между таблицами. Я просто хочу взять значения из некоторых данных и поместить их в другие столбцы. Но это не сработает. Как я могу переписать запрос? Я хочу, чтобы OVERWRITE значения в таблице wkfc со значениями из swkf.

Я знаю, что правильно, как я могу заставить 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) 

Если вы хотите UPDATE (SELECT ... FROM A INNER JOIN B ON condition) SET AX = ... тогда условие соединения должно ограничивать все столбцы некоторого ограничения единственности на B одним значением.

Во-первых, мы не можем обновлять две таблицы, используя один запрос через представление соединения. В этом случае мы можем выбрать процедуру 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 для сравнения базовой таблицы с ссылочной таблицей, и мы можем обновить одну таблицу.

 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 

Ниже URL объясняет, как выполнить это объединение на не уникальных столбцах

Oracle – обновление соединения – таблица без сохранения ключей