Я пытаюсь обновить таблицу в Oracle, и у меня возникают некоторые трудности.Я портирую свой код из MySQL, и некоторые команды, которые разрешает MySQL, не поддерживаются в Oracle.
Вот код MySQL:
update table1 t1 set c5 = (select ContractID from table2 t2 where t1.assetid =
t2.assetid and t1.lastdate >= t2.lastdate and t1.firstdate= t2.firstdate
order by lastdate asc limit 1 offset 4);
Подзапрос возвращает списокContractIDS, отсортированный по lastdate, и мне нужен только конкретный, следовательно, команда limit offset 1 offset X.
Проблема заключается в следующем.Oracle не поддерживает команды «limit» или «offset».Существуют обходные пути к проблеме ограничения с использованием rownum и вложенных запросов, но синтаксическому анализатору Oracle 11G они не нравятся в команде UPDATE.
У меня была похожая проблема раньше, когда мне требовалось ограничение в команде обновления,но не смещение.Это было решено здесь: Синтаксическая ошибка MySQL to Oracle (Limit / Offset / Update)
Существует обходной путь, который Флорин Гита нашел с помощью аналитических функций.
update table1 alf
set nextcontractid =
(SELECT min(contractid) keep (dense_rank first order by lasttradedate asc)
FROM table1copy alf2
WHERE alf2.assetid = alf.assetid
AND alf2.lasttradedate > alf.lasttradedate
)
where alf.complete = 0
Этот обходной путь позволяет мне получить верхнюю или нижнюю запись (с помощью asc или desc в команде dens_rank), но я не могу найти прокси для команды смещения, если мне нужен второй или третий ряд.
В другом решении, которое я пробовал, использовался вложенный запрос.Первые получили первые 5 строк с помощью команды rownum, упорядочили их в обратном порядке, минус последние четыре ряда.Это решение не удалось, потому что синтаксический анализатор Oracle не понимал ссылку на таблицу в самой внешней команде, указанной в одном из вложенных запросов.
(Та же проблема, что у меня была раньше: Синтаксис MySQL to OracleОшибка (ограничение / смещение / обновление) )
Задача состоит не просто в том, чтобы выполнить оператор выбора в Oracle с ограничением и смещением, поскольку я уже могу сделать это с помощью вложенных запросов.Задача состоит в том, чтобы заставить оператор select работать в операторе обновления, поскольку, хотя оператор синтаксически корректен, синтаксический анализатор Oracle не может их декодировать.Пока что мне не удавались вложенные запросы (и Google).
У кого-нибудь еще были подобные проблемы?