sql - ORA-38104 - 在 MERGE 中更新 ON 子句中的列的解决方法是什么?
问题描述
对于 in 中的值,我有table FOO
一些 ID 值,col N_RA_ID
对于非手动值,我有一些匹配的值。这是示例数据 -MANUAL%
col V_CUST_NUMBER
col N_RA_ID
col V_CUST_NUMBER
我想自己加入col N_RA_ID
,只要有完全匹配的地方,我想update N_RA_ID
加入null WHERE V_CUST_NUMBER LIKE 'MANUAL%'
所以输出应该看起来像 -
我尝试使用合并但得到 ORA-38104。有人可以帮忙吗?
MERGE INTO FOO X
USING (
SELECT T1.V_CUST_NUMBER AS MAN_CUST,T1.N_RA_ID, T2.V_CUST_NUMBER
FROM FOO T1
JOIN FOO T2
ON T1.N_RA_ID = T2.N_RA_ID
AND UPPER(T1.V_CUST_NUMBER) NOT LIKE 'MANUAL%'
) Z
ON (X.N_RA_ID = Z.N_RA_ID)
WHEN MATCHED THEN UPDATE
SET X.N_RA_ID = null
WHERE UPPER(X.V_CUST_NUMBER) LIKE 'MANUAL%'
SQL Error: ORA-38104: Columns referenced in the ON Clause cannot be updated: "X"."N_RA_ID"
38104. 00000 - "Columns referenced in the ON Clause cannot be updated: %s"
*Cause: LHS of UPDATE SET contains the columns referenced in the ON Clause
*Action:
解决方案
您可以通过检查进行简单更新exists ()
:
update foo f1
set n_ra_id = null
where v_cust_number like 'MANUAL%'
and exists (
select *
from foo f2
where f2.n_ra_id = f1.n_ra_id
and v_cust_number not like 'MANUAL%'
);
主要更新首先过滤以“MANUAL”开头的所有行,然后内部的子查询exists()
查找表中具有相同 ID 但不以“MANUAL”开头的任何行。如果没有这样的非手动行,则该子句为假,手动行保持不变;如果匹配,则更新该行。
演示:
select * from foo;
V_CUST_NU N_RA_ID
--------- ----------
MANUAL033 17024
MANUAL034 589469
MANUAL035 589470
MANUAL036 589478
BHASAD 589478
update foo f1
set n_ra_id = null
where v_cust_number like 'MANUAL%'
and exists (
select *
from foo f2
where f2.n_ra_id = f1.n_ra_id
and v_cust_number not like 'MANUAL%'
);
1 row updated.
select * from foo;
V_CUST_NU N_RA_ID
--------- ----------
MANUAL033 17024
MANUAL034 589469
MANUAL035 589470
MANUAL036
BHASAD 589478
推荐阅读
- excel - Excel自动筛选以分号分隔的单元格
- r - 将列名的 dtype 从浮点数更改为字符串?
- python - 如何找到两个日期时间之间的差异,不包括一天中的时间间隔?
- java - 初始化需要网络调用 Java 的对象的最佳实践
- php - 配置中的 Laravel 队列排序
- azure - 在 Web API 控制器中从 Azure AD 获取当前登录的用户详细信息
- tensorflow - keras 在对两个输出使用两个损失函数时会出错
- foreach - FOREACH SELECT(循环)期间填充 varchar/char
- c# - C# - 将 DataTable 作为左对齐(左对齐)列导出到 Excel
- javascript - 如何通过单击 HTML 按钮调用 javascript 函数?