Лимит / Смещение в Oracle 11G

Я пытаюсь обновить стол в 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);

Подзапрос возвращает список контрактов, отсортированных по LAPLDATE, и я хочу только определенного, поэтому предел 1 offset X команда.

Проблема заключается в следующем. Oracle не поддерживает команды «ограничения» или «смещения». Существуют обходные пути к ограниченной проблеме с использованием аронума и вложенных запросов, но парсер Oracle 11G не любит их в команде обновления.

У меня была похожая проблема до того, где мне нужно предел в команде обновления, но не смещение. Здесь было решено: MySQL в синтаксическую ошибку Oracle (Limit / Offet / 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 в команде deste_rank), но я не могу найти прокси для команды смещения, если я хочу вторую или третий ряд.

Другое решение, которое я пробовал, использовал вложенный запрос. Первый получил первые 5 строк, используя команду ROWNUM, заказал их противоположным образом, минус - из-за последних четырех строк. Это решение не удалось, поскольку анализатор Oracle не понял ссылки на таблицу в команде Outermost, на который ссылаются внутри одного из вложенных запросов.

(Та же проблема, так как у меня раньше: MySQL в Oracle Syntax Ошибка (ограничение / смещение / обновление) )

Challenge не просто запустить оператор выбора в Oracle с пределом И смещение, как я уже могу сделать это через вложенные запросы. Задача состоит в том, чтобы получить оператор Select для работы в операторе обновления, потому что, хотя оператор синтаксически правильный, парсер Oracle не удается декодировать их. До сих пор вложенные запросы (и Google) потерпели неудачу.

У кого-нибудь еще есть подобные проблемы?

7
задан Community 23 May 2017 в 12:06
поделиться