【问题标题】:Can we use alias in merge statement我们可以在合并语句中使用别名吗
【发布时间】:2020-08-21 14:17:59
【问题描述】:
Merge into exchangeuplift up
using (select up. Rowid row_id, up.forcedcharge/evcal.totalnotion)
from exchange evcal
join exchangeuplift up
on evcal.exchangename = up.exchangename
and up.isactive = 1
and up.forcedcharge <> 0 evcal.totalnotion <> 0 ) src
on (up.rowid = src.row_id)
when matched then
update set forcedchargepro = (src.forcecharge/ evcal.totalnotion)
错误:ora-00904 "evcal.totalnotion" 标识符无效
最后一行出现错误,我们可以在设置条件下使用除法
【问题讨论】:
-
你的代码在你碰到那个错误之前有几个错误;我想你有一个额外的) 并缺少一个and,但很难确定。请发布您的实际代码和format it。即使那样我也不确定你在问什么;或者为什么 - 你已经为row_id 使用了别名?您的set 子句引用evcal.totalnotion,但evcal 仅在using() 子句的范围内,src.forcecharge 但src 块没有它作为别名。所以不清楚您是想要原始值还是只需要计算结果(确实需要列别名)。
标签:
oracle
oracle11g
sql-merge
【解决方案1】:
您的代码有几个错误,似乎是拼写错误或转录错误的混合,但看起来您可能正在尝试这样做:
merge into exchangeuplift up
using (
select up.rowid row_id,
up.forcedcharge / evcal.totalnotion result
from exchange evcal
join exchangeuplift up
on evcal.exchangename = up.exchangename
and up.isactive = 1
and up.forcedcharge <> 0
and evcal.totalnotion <> 0
) src
on (up.rowid = src.row_id)
when matched then update
set forcedchargepro = src.result
我将using 子句中的计算结果赋予别名result,然后在set 子句中引用它。您不能在该子句中引用来自evcal 或内部up 的列。
在using 子句中再次查看exchangeuplift 似乎有点多余;这也可能有效:
merge into exchangeuplift up
using exchange src
on (up.exchangename = src.exchangename)
when matched then update
set up.forcedchargepro = up.forcedcharge / src.totalnotion
where up.isactive = 1
and up.forcedcharge <> 0
and src.totalnotion <> 0
或者也许:
merge into exchangeuplift up
using exchange src
on (up.exchangename = src.exchangename
and up.isactive = 1
and up.forcedcharge <> 0
)
when matched then update
set up.forcedchargepro = up.forcedcharge / src.totalnotion
where src.totalnotion <> 0
db<>fiddle 使用基于代码似乎在做什么的虚构数据,因为您没有提供数据或预期结果。