【问题标题】:Oracle Merge: When not matched then delete and insertOracle Merge:当不匹配时删除并插入
【发布时间】: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;

你能帮我删除和插入或告诉我一个方法吗?

【问题讨论】:

  • 不清楚你在这里问什么。匹配则删除,不匹配则删除。

标签: sql oracle merge-statement


【解决方案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 我已根据您提供的信息更新了我的答案
猜你喜欢
  • 2017-05-12
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
相关资源
最近更新 更多