首页 > 解决方案 > ORA-38104 - 在 MERGE 中更新 ON 子句中的列的解决方法是什么?

问题描述

对于 in 中的值,我有table FOO一些 ID 值,col N_RA_ID对于非手动值,我有一些匹配的值。这是示例数据 -MANUAL%col V_CUST_NUMBERcol N_RA_IDcol 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:

标签: sqloraclesql-updateoracle12c

解决方案


您可以通过检查进行简单更新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

推荐阅读