我们可以在合并语句中使用别名吗

时间:2020-08-21 14:17:59

标签: oracle oracle11g sql-merge

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”无效的标识符

最后一行出现错误,我们可以在设定的条件下使用除法吗

1 个答案:

答案 0 :(得分:0)

您的代码中有几个错误,似乎是错别字或抄写错误的混合,但您似乎正在尝试做:

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中的列。

exchangeuplift子句中再次查看using似乎有点多余;这可能也可以:

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包含根据代码似乎在做什么的虚构数据,因为您没有提供数据或预期结果。