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:当不匹配时删除并插入的主要内容,如果未能解决你的问题,请参考以下文章

在 ORACLE 中使用 MERGE 语句删除和插入

merge into using 详解

Oracle merge into的优势

Oracle SQL中的Merge用法

当条件匹配新插入的记录时,T-Sql MERGE 语句更新

Git---报错:git Please move or remove them before you can merge 解决方案