Oracle Merge:当不匹配时删除并插入
Posted
技术标签:
【中文标题】Oracle Merge:当不匹配时删除并插入【英文标题】:Oracle Merge: When not matched then delete and insert 【发布时间】:2014-11-26 17:18:37 【问题描述】:我有一个简单的查询,但只有一部分让我感到困惑:
我有以下算法:
merge into table_1 table_2
on table_1.val1 = table_2.val1
when matched and table_1.val2 = table_2.val2
then merge
when matched and table_1.val2 != table_2.val2
then delete and insert ( I AM NOT SURE NOW TO DO THIS)
when not matched
then insert;
你能帮我删除和插入或告诉我一个方法吗?
【问题讨论】:
不清楚你在这里问什么。匹配则删除,不匹配则删除。 【参考方案1】:您不能在 WHEN MATCHED THEN UPDATE 子句中插入。您只能在此处删除。如果可以更新,为什么需要删除然后插入?像这样的:
merge into table_1
using table_2 on (table_1.val1 = table_2.val1)
when matched then
update set table_1.val3 =
case when table_1.val2 = table_2.val2
then table_1.val3
else table_2.val3 end
when not matched then insert ...
从下面的 cmets 我想你需要这样的东西:
1) 没有引用 table_1 的外键 2) 禁用table_1中的主键val2 3) 更新 table_1 设置 val2 = null; 4) 运行合并 5) 从 val2 为空的 table_1 中删除; 6) 启用table_1中的主键
【讨论】:
问题是原始查询中的val2是主键。但遗憾的是更新基于 val1。我现在无法更改主键,因此当两个表的 val2 不匹配时,我需要删除该行和具有 val2 冗余值的另一行。 @Anuja Khemka 更新主键不是一个好习惯。并且 table_1.val1 至少对于匹配值 table_2.val1 应该是唯一的,否则合并将失败。我认为在这种情况下你不能使用 MERGE。 val1 是唯一的。问题是由于主键的更新很困难,所以我的表中 val1 到 val2 的映射是错误的。我想到了一个解决方法,但不知道该怎么做:merge into table_1 table_2 on (table_1.val1 = table_2.val1 and table_1.val2 = table_2.val2) when matched then merge when not matched (case when table_1.val2 != table_2.val2) then delete else insert end);
@Anuja Khemka 我已根据您提供的信息更新了我的答案以上是关于Oracle Merge:当不匹配时删除并插入的主要内容,如果未能解决你的问题,请参考以下文章
Git---报错:git Please move or remove them before you can merge 解决方案