更新表不能修改映射到非键保留表的列

Posted

技术标签:

【中文标题】更新表不能修改映射到非键保留表的列【英文标题】:Update table cannot modify a column which maps to non key preserved tqbles 【发布时间】:2020-05-18 13:22:14 【问题描述】:

**

Update (select l1,l1desc,label,label_desc 
       From member_dig m Join member_label ml 
       On m.member_id =ml.member_id) 
t Set t.l1=t.label, T.l1desc=t.label_desc;

**

当我单独运行 select 时,结果似乎很好,但我的更新失败并出现“无法修改映射到非键保留表的列”错误。

【问题讨论】:

样本数据、期望的结果和清晰的解释都会有所帮助。 从您的查询中无法了解您要更新哪个表的列。使用 select 的输出值列表中的别名来澄清。确保您的选择不会返回多于您需要更新的记录。另外,尝试使用只有分支“匹配然后更新”的合并运算符。 【参考方案1】:

Oracle 对UPDATEs 中的任何JOINs 都非常挑剔。另一方面,它具有使用单个子查询更新多个列的便捷功能。

所以你可以这样做:

update member_dig m 
    set (l1, l1desc) = (select ml.label, ml.label_desc
                        from member_label ml
                        where m.member_id = ml.member_id
                       )
    where exists (select 1
                  from member_label ml
                  where m.member_id = ml.member_id
                 );

我不得不猜测要更新哪个表以及列来自哪里,因为您的问题不清楚。但是,这种类型的东西应该可以满足您的需求。

【讨论】:

您可以通过使用merge而不是update来避免双重链接到表member_label,这会产生相同的结果。

以上是关于更新表不能修改映射到非键保留表的列的主要内容,如果未能解决你的问题,请参考以下文章

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

Oracle - 更新连接 - 非键保留表

Oracle - 更新连接 - 非键保留表

使用具有和 MIN 函数非键保留表错误进行更新

在更新一个表的列相对于另一个表的列时避免多个 SELECT

将表的列更新为序列