#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 в случае обновления большего количества столбцов.