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

删除update语句并将一些虚拟值放入子查询中会产生子查询的正确结果:

(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

来源: https://codeday.me/bug/20190704/1379607.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值