MySQL 到 Oracle 语法错误(限制/偏移/更新)

2024-04-05

我有一个适用于我当前的 MySQL 数据库的 MySQL 查询。我被迫转向 Oracle,因此我尝试移植所有存储过程/程序以使用 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命令,所以我寻找解决方法。这是我的 Oracle 查询。 (这是行不通的。)

 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 中工作吗?


似乎解析器不喜欢这样,尽管事实上它在语法上是正确的。也许这两个叠瓦状、有序的条款不知何故蒙蔽了他。我复制了那个。

您可以使用分析函数:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 到 Oracle 语法错误(限制/偏移/更新) 的相关文章

随机推荐