Синтаксическая ошибка MySQL to Oracle (ограничение / смещение / обновление) - PullRequest
4 голосов
/ 01 сентября 2011

У меня есть запрос MySQL, который работает с моей текущей базой данных MySQL.Я был вынужден перейти к оракулу, поэтому я пытаюсь перенести все свои хранимые процедуры / программы на использование синтаксиса Oracle SQL.У меня много проблем по одному конкретному запросу.Вот запрос MySQL.Он обновляет таблицу, используя подзапрос.

 update table1 alf 
 set nextcontractid = 
 (
 select 
    contractid from table1copy alf2 
 where 
    alf2.assetid = alf.AssetID 
 and 
    alf2.lasttradedate > alf.LastTradeDate 
 order by lasttradedate asc limit 1
 ) 
 where complete = 0

В oracle я не могу использовать команду limit, поэтому я искал обходной путь.Вот мой запрос оракула.(что не работает.)

 update table1 alf
 set nextcontractid = 
   (select contractid from
     (
     SELECT contractid, rownum as row_number
     FROM table1copy alf2
     WHERE alf2.assetid     = alf.assetid
     AND alf2.lasttradedate > alf.lasttradedate
     ORDER BY lasttradedate ASC
   ) 
   where row_number = 1)
 where alf.complete = 0

Я получаю следующую ошибку:

 Error at Command Line:8 Column:29
 Error report:
 SQL Error: ORA-00904: "ALF"."LASTTRADEDATE": invalid identifier
 00904. 00000 -  "%s: invalid identifier"

строка 8:

 AND alf2.lasttradedate > alf.lasttradedate

Удаление оператора обновления ивставка некоторых фиктивных значений в подзапрос дает правильные результаты для подзапроса:

   (select contractid from 
     ( 
     SELECT contractid, rownum as row_number 
     FROM asset_list_futures_copy alf2 
     WHERE alf2.assetid     = 'GOLD' 
     AND alf2.lasttradedate > '20110101' 
     ORDER BY lasttradedate ASC 
     )  
    where row_number = 1)

Если посмотреть на ошибку, похоже, что вторая ссылка на alf не работает.Любая идея, как я могу изменить свой запрос, чтобы он работал в Oracle?

Ответы [ 2 ]

2 голосов
/ 01 сентября 2011

Кажется, парсеру это не нравится, хотя он синтаксически корректен.Вероятно, два запутанных и упорядоченных пункта ослепляют его как-то.Я воспроизвел это.

Вы можете использовать аналитическую функцию:

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
0 голосов
/ 01 сентября 2011

Вы можете использовать WHERE rownum = 1 или rownum BETWEEN x AND y в тех случаях, когда хотите получить больше результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...