sql - 更新连接中使用的列
问题描述
我有一个表格,其中一列 ( 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 拒绝了它,因为“无法在源表中获得一组稳定的行”。
我怎样才能使这项工作?
解决方案
您也可以在 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;
推荐阅读
- c# - ASP.NET Core 3.0 使用属性路由更改默认端点路由
- angularjs - 如何将单选按钮值传递给控制器?
- firebase - 有没有办法在firebase中向用户电子邮件发送一次性代码
- android - 播放安装推荐人库
- .net-core - MAC 上的 dotnet tool install --global dotnet-ef --version 3.0.0 导致未知 Nuget 错误
- java - 在 intellij 中运行 pentaho 勺子 UI
- r - 正确计算组内的累积值
- excel - 复制打开的 Excel 文件
- scala - 如何创建如下 Spark DF
- python - 尽管屏蔽了对 keras 中零填充小批量 LSTM 训练的支持,但预测为零