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

#oracle

#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 вы можете использовать псевдоним таблицы в непосредственном подзапросе (на один уровень ниже), но не в более глубоко вложенных подзапросах.

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

Ответ №2:

Я бы сделал:

   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;
  

Комментарии:

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

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