【发布时间】:2019-07-30 13:24:20
【问题描述】:
我有一个表格,其中一列 (TXN_AMT) 填充不正确。我正在尝试使用来自同一个表的聚合数据更新该列,基于以下条件:对于给定日期的同一帐号,如果有多个交易并且交易金额大于或等于实际金额的总和,则更新交易金额与实际金额。我尝试使用MERGE 和子查询,但Oracle 拒绝了我的更新,并显示“无法更新ON 子句中引用的列”。我的查询:
MERGE INTO TXN W
USING (
select TXN_AMT, ACCOUNT_NUM, TXN_DATE, sum(ACTUAL_AMT), count(1)
from TXN
where TXN_AMT is NOT NULL
and TXN_AMT > ACTUAL_AMT
group by TXN_AMT, ACCOUNT_NUM, TXN_DATE
having count(1) > 1 and TXN_AMT >= sum(ACTUAL_AMT)
) TBL
ON (W.ACCOUNT_NUM = TBL.ACCOUNT_NUM
AND W.TXN_DATE = TBL.TXN_DATE
AND W.TXN_AMT = TBL.TXN_AMT)
WHEN MATCHED THEN UPDATE SET W.TXN_AMT = W.ACTUAL_AMT;
我尝试为内部子查询创建一个单独的表,但这次 Oracle 以“无法在源表中获得一组稳定的行”拒绝了它。
我怎样才能做到这一点?
【问题讨论】:
-
错误清楚地表明当您在
ON子句中使用此列时,您无法更新列 W.TXN_AMT。请从 on 子句中删除此列并尝试一下。 -
我知道。但我需要考虑查询中的 TXN_AMT
-
我不确定我是否遵循您尝试执行的更新的逻辑,也不确定受影响表结构的相关部分。你能举个例子吗?你的表是如何键控的?
标签: sql oracle merge sql-update