2016-10-24 2 views
0

Она возвращаетOracle подзапрос не видит переменную на втором уровне

«недопустимый идентификатор» на «pe.partyid» (уровень 2).

Не могли бы вы посоветовать, как исправить?

update table_x pe 
    set pe.taxidnumber = 
     (select tin 
      from (select tin 
         ,version 
         ,max(version) over(partition by partyid) maxversion 
        from table_y 
       where partyid = pe.partyid) 
     where version = maxversion); 

ответ

1

В Oracle вы можете использовать псевдоним таблицы в немедленном подзапроса (один уровень вниз), но не более глубоко вложенных подзапросов.

Вы можете обойти это с факторизованными подзапросами (предложение WITH). Но в вашем случае непонятно, почему вам нужен коррелированный подзапрос. Переместите условие WHERE при совпадении на partyid на средний запрос; таким образом, внутренний запрос будет некоррелирован, поэтому он будет вычислен только один раз. Переместите partyid рядом с version = maxversion.

0

Я хотел бы сделать:

create global temporary table tempt as select tin, partyid from table_y where rownum < 2; 
    insert into tempt select tin, partyid 
      from (select tin 
         ,partyid 
         ,version 
         ,max(version) over(partition by partyid) maxversion 
        from table_y 
     where version = maxversion); 
    merge into table_x t 
    using tempt d 
    on (t.partyid = d.partyid) 
    when matched then update set t.tin = d.tin; 
+0

Временная таблица не нужна. Вы можете использовать этот оператор 'select' непосредственно в инструкции' merge'. –

+0

@a_horse_with_no_name Спасибо за комментарий, я знаю это, но я разместил решение с помощью таблицы temp, чтобы избежать confusin с ORA-30926 в случае обновления большего количества столбцов. – Kacper

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