有人可以解释一下MERGE声明在Oracle中的作用吗?

时间:2011-02-01 14:47:08

标签: oracle implementation

我正在寻找甲骨文中MERGE语句真正做法的明确解释。

以下是我的意思:

MERGE INTO (target_table) t
USING (source_view) s
   ON (join condition)
 WHEN MATCHED THEN UPDATE SET col1 = val1 [, ...]
 WHEN NOT MATCHED THEN INSERT (col1 [, ...]) VALUES ( val1 [, ...])
  • 执行什么样的连接?我认为这是完全外联,我是对的吗?
  • 关于WHEN MATCHED部分:来自t的行与来自s的多行匹配时会发生什么?
  • 关于WHEN NOT MATCHED部分,我认为当s中的行与t 中没有对应关系时,它意味着“。我是对的吗?

谢谢。

2 个答案:

答案 0 :(得分:11)

  

执行什么样的连接?一世   认为这是完全外联,我   正确?

不,这是一个常规的外部联接。查询需要知道目标表中的行何时也在源表中,以及源表中是否有不在目标表中的记录。由于查询不需要响应目标表中但不在源表中的行,因此不需要外部联接双向进行。

但是,如果没有not matched子句(完全有效),则不会执行外连接。优化器足够聪明,知道在这种情况下,内连接就足够了。

  

关于WHEN MATCHED部分:什么   当来自t的一行匹配时发生   来自s的多行?

当有多个匹配项时,将对每个匹配项执行更新。这意味着最后一次更新将是提交中写入的更新。没有办法规定订单,所以在这种情况下,更新的来源实际上是随机的(来自匹配集)。

@ Vincent Malgrat指出,这是不正确的。如果有多个匹配项,Oracle似乎会生成“ORA-40926:无法在源表中获取稳定的行集”错误。

  

关于WHEN NOT MATCHED第一部分   相信这意味着“当s中有一排时   在t“没有对应关系。我是对的吗?

这是正确的。

答案 1 :(得分:2)