sql - ORA-01779 无法修改映射到非键保留表的列

标签 sql oracle sql-update oracle12c

我有一个关注 SELECT询问 -

SELECT C.CASE_TITL_NM,RA.V_CUST_NUMBER
FROM KDD_CASES C
JOIN FCT_RA RA
ON RA.N_RA_ID = C.RA_ID
WHERE UPPER(C.CNTRY_KEY_ID) LIKE '%MANUAL%' 
AND C.SCORE_CT IN (99,100)
AND C.STATUS_CD = 'CCD'
AND C.CASE_TITL_NM NOT LIKE 'MANUAL%'

Result of SELECT query

我需要更新 col V_CUST_NUMBER 中的值列中的值 CASE_TITL_NM所以我插上了我的 SELECT内关注 UPDATE语句并运行它只是为了得到 ORA01779 -
    UPDATE (
    SELECT C.CASE_TITL_NM,RA.V_CUST_NUMBER
    FROM KDD_CASES C
    JOIN FCT_RA RA
    ON RA.N_RA_ID = C.RA_ID
    WHERE UPPER(C.CNTRY_KEY_ID) LIKE '%MANUAL%' 
    AND C.SCORE_CT IN (99,100)
    AND C.STATUS_CD = 'CCD'
    AND C.CASE_TITL_NM NOT LIKE 'MANUAL%'
    ) X
    SET X.V_CUST_NUMBER = X.CASE_TITL_NM;

SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 -  "cannot modify a column which maps to a non key-preserved table"
*Cause:    An attempt was made to insert or update columns of a join view which
           map to a non-key-preserved table.
*Action:   Modify the underlying base tables directly.

任何人都可以解释这个错误是什么意思,什么是正确的 UPDATE询问?

最佳答案

它的意思是指定的查询结果在具有 RA 重复行的输出集中。看到一个 RA 行映射到两个不同的 C 行,您不能更新 RA,因为有可能尝试更新唯一的 RA 行以具有两个不同的值

您可以尝试使用 MERGE 语句,使用 SQL-that-writes-SQL 创建一堆 UPDATE 语句,或修改连接条件,以便输出中不存在来自 RA 的重复行并且覆盖来自 RA 的主键

关于sql - ORA-01779 无法修改映射到非键保留表的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53402273/

相关文章:

sql - 正确计算 2 个日期范围之间的时间

sql - 使用 SSIS 清除 Excel 中的数据

sql - Oracle SQL 创建或替换带/不带列名的 View

mysql - 用于更新的内部 Sql 不工作 Mysql 5.6

MySQL FROM语句错误: FROM is not a valid input at this position

sql - 在 SQL 中插入缺失值

sql - 如何一次加载特定行 100

sql - 如何使用jsp将日期插入数据库?

oracle - Oracle 的自主事务何时结束?

sql - 如何创建一个查询,将任何大小写的匹配记录更新为大写