更新表不能修改映射到非键保留表的列
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 对UPDATE
s 中的任何JOIN
s 都非常挑剔。另一方面,它具有使用单个子查询更新多个列的便捷功能。
所以你可以这样做:
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,这会产生相同的结果。以上是关于更新表不能修改映射到非键保留表的列的主要内容,如果未能解决你的问题,请参考以下文章