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