LIMIT / OFFSET в Oracle 11G - PullRequest
       5

LIMIT / OFFSET в Oracle 11G

7 голосов
/ 07 сентября 2011

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

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

1 Ответ

0 голосов
/ 07 сентября 2011

Удаленный исходный ответ, нежизнеспособный

Я чувствую, что это должно быть выполнимо в одном операторе SQL, но до сих пор это сочетание необходимости коррелированного подзапроса и необходимости некоторыхАналитическая функция сделала все, что я пробовал, неудачей.

Вот процедурный метод, который, я думаю, сделает то, что вы хотите:

DECLARE
  CURSOR t IS
  SELECT LEAD(contractid,4) OVER (PARTITION BY assetid ORDER BY lasttradedate ASC) lead_contractid
    FROM table1
    FOR UPDATE;
BEGIN
  FOR r IN t LOOP
     UPDATE table1 SET nextcontractid = r.lead_contractid
       WHERE CURRENT OF t;
  END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...