【问题标题】:update statement with two or more inner join oracle and calculate values also select from a view具有两个或多个内部连接 ​​oracle 和计算值的更新语句也从视图中选择
【发布时间】:2016-12-20 14:58:26
【问题描述】:

我收到一个错误,即在预期的地方找不到 FROM 关键字。请让我知道以下代码中可能有什么问题。我正在尝试使用两个内部连接进行更新,并从另一个视图中进行选择。请让我知道如何在 oracle 中完成此操作。

  update (Select asset.CRV_AMOUNT as ACRV, 
                 cmd.CRV_PERCENT  as CRVP, 
                 (select CRV$ 
                    from recapt.facility_rec_crv_V fac_v 
                   where fac_v.fac_code = fac.code 
                     AND fac_v.complex_code = fac.complex_code) CRV_TOTAL as CRVT 
            from recapt.asset asset
                 inner join  recapt.facility_rec fac
                    on fac.code = asset.fac_rec_code and 
                       fac.complex_code = asset.complex_code
                 inner join recapt.cost_model_detail cmd
                    on cmd.cost_model_id = fac.cost_model_id and
                       cmd.mf_division_id = asset.mf_division_id) t
     SET t.ACRV = ((t.CRVP * t.CRVT)/100);

【问题讨论】:

  • 您使用双重别名 () CRV_TOTAL as CRVT ) 标量子查询。另外,这不是可更新的视图。
  • 所以我可以只使用 CRV_TOTAL 吗?
  • 我改变了,现在我得到“无法修改映射到非键保留表的列”
  • 是否没有其他方法可以从视图中读取来计算,因为我没有在查询中编辑视图值

标签: sql oracle join sql-update inner-join


【解决方案1】:

您可以尝试切换到 MERGE 语句 - 它可能会更容易编码和理解。 我无法对此进行测试,但可以通过以下方式进行测试:

merge into recapt.asset asset
using (select fac.code,
              fac.complex_code,
              cmd.mf_division_id,
              cmd.crv_percent as crvp,
              (select crv$
                 from recapt.facility_rec_crv_v fac_v
                where fac_v.fac_code = fac.code
                  and fac_v.complex_code = fac.complex_code) as crvt
         from recapt.facility_rec fac
        inner join recapt.cost_model_detail cmd
           on cmd.cost_model_id = fac.cost_model_id) t
    on (asset.fac_rec_code = t.code and
        asset.complex_code = t.complex_code and
        asset.mf_division_id = t.mf_division_it)
  when matched then
    update set asset.acrv = (t.crvp * t.crvt) / 100;

如果您提供创建表和插入语句(带有少量测试数据),我可能能够对此进行测试和/或提供更好的解决方案。

【讨论】:

    猜你喜欢
    • 2011-12-13
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多