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

标签 mysql oracle

我有一个适用于我当前 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

关于MySQL 到 Oracle 语法错误(限制/偏移/更新),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7271040/

相关文章:

java - 从对象类型的 Oracle 检索表时,所有字符串均为 "???"

oracle - 如何使用普通游标中的值打开 sys_refcursor?

sql - 假脱机时删除前导空格和 SQL> 标签

mysql - 在 MySQL : selecting publications on keyword but including all keywords in results

php - PDO + MySQL 总是返回字符串,但是 MsSQL 呢?

mysql - 加载错误: cannot load such file -- dbd-mysql

mysql - 在查询中将多条记录作为一个字符串返回

database - 如何构建表以快速搜索大量列

Oracle 中的 SQL 调优

mysql - phpMyAdmin 创建一个触发器,用于在不存在子行时删除父行