首页 > 解决方案 > 更新连接中使用的列

问题描述

我有一个表格,其中一列 ( 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 拒绝了它,因为“无法在源表中获得一组稳定的行”。

我怎样才能使这项工作?

标签: sqloraclemergesql-update

解决方案


您也可以在 MERGE 语句中执行此操作,方法是使用连接和分析函数中的 rowid 来进行求和和计数,例如:

MERGE INTO txn w
USING (SELECT ROWID rid,
              txn_amt,
              account_num,
              txn_date,
              SUM(actual_amt) over(PARTITION BY txn_amt, account_num, txn_date) actual_amt,
              COUNT(1) over(PARTITION BY txn_amt, account_num, txn_date) actual_amt cnt
       FROM   txn
       WHERE  txn_amt IS NOT NULL
       AND    txn_amt > actual_amt) tbl
ON (w.rowid = tbl.rid AND tbl.cnt > 1)
WHEN MATCHED THEN
  UPDATE
  SET    w.txn_amt = w.actual_amt
  where  tbl.txn_amt >= tbl.actual_amt;

推荐阅读