2014-12-30 3 views
0

Использование Oracle 11g. Мне нужно сделать обновление с самостоятельным подключением. Oracle не поддерживает обновления с соединениями и с помощью MERGE не работает, как я пытаюсь сделать обновление для столбцов, используемых в статье наOracle - Обновление с присоединением

Что я пробовал:

update 
    (
    select a.ID, a.FROM_STAGE_ID, a.TO_STAGE_ID, b.TO_STAGE_ID 
     from STATES a, 
      STATES b 
     where a.ID = b.ID and 
      a.TO_STAGE_ID = b.FROM_STAGE_ID and 
      a.TO_STAGE_ID = 'FIZZBUZZ' and 
      a.FROM_STAGE_ID <> b.TO_STAGE_ID and 
      a.CODE = b.CODE 
    ) 
    set a.TO_STAGE_ID=b.TO_STAGE_ID; 

Это привело в: "Ошибка SQL: ORA-00904: "в TO_STAGE_ID"." ": недействительный идентификатор"

MERGE 
    INTO STATES a 
    USING STATES b 
    ON ( 
      a.ID = b.ID and 
      a.TO_STAGE_ID = b.FROM_STAGE_ID and 
      a.TO_STAGE_ID = 'FIZZBUZZ' and 
      a.FROM_STAGE_ID <> b.TO_STAGE_ID and 
      a.CODE = b.CODE 
     ) 
    WHEN MATCHED THEN 
    UPDATE 
    set a.TO_STAGE_ID = b.TO_STAGE_ID; 

в результате: «Ошибка SQL: ORA-38104: Столбцы, указанные в пункте ON не могут быть обновлены: «A». «TO_STAGE_ID» 38104. 00000 - «Столбцы, указанные в разделе ON, не могут быть обновлены :% s " * Причина: LHS из UPDATE SET содержит столбцы, указанные в разделе ON.

Я могу попытаться удалить строки, требующие обновления, и заполнить их из таблицы промежуточной/временной таблицы, но мне интересно посмотреть, есть ли там это другой способ.

ответ

0

Ошибка в первом случае связана с тем, что вы пытаетесь ссылаться на столбцы, используя псевдонимы таблиц, которые действительны только в области подзапроса. Вы должны быть в состоянии обойти это альясингом столбцы:

update 
    (
    select a.ID, a.FROM_STAGE_ID, a.TO_STAGE_ID a_to_stage_id, b.TO_STAGE_ID b_to_stage_id 
     from STATES a, 
      STATES b 
     where a.ID = b.ID and 
      a.TO_STAGE_ID = b.FROM_STAGE_ID and 
      a.TO_STAGE_ID = 'FIZZBUZZ' and 
      a.FROM_STAGE_ID <> b.TO_STAGE_ID and 
      a.CODE = b.CODE 
    ) 
    set a_to_stage_id = b_to_stage_id 

Это до сих пор не может работать - это зависит от того, присоединиться ли сохраняет ключ исходной таблицы.

+0

Спасибо, но не кубики. «Ошибка SQL: ORA-01779: невозможно изменить столбец, который сопоставляется с таблицей, не содержащей ключей 01779. 00000 -« не может изменять столбец, который сопоставляется с таблицей, не содержащей ключей » * Причина: Попытка была сделана вставить или обновить столбцы вида соединения, которые сопоставляются с таблицей, не содержащей ключей. * Действие: непосредственно изменить базовые базовые таблицы. " – AfterWorkGuinness

Смежные вопросы