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

Ben*_*oit 12 oracle implementation

我正在寻找一个明确的解释,MERGE说明Oracle 的声明真正做了什么.

这就是我所追求的:

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 [, ...])
Run Code Online (Sandbox Code Playgroud)
  • 进行什么样的连接?我认为这是全外联盟,对吗?
  • 关于WHEN MATCHED部分:当一行t匹配多行时会发生什么s
  • 关于这WHEN NOT MATCHED部分我认为它意味着"当一行s没有对应t "时.我对吗?

谢谢.

All*_*lan 11

进行什么样的连接?我认为这是全外联盟,对吗?

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

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

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

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

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

关于WHEN NOT MATCHED部分,我认为它意味着"当s中的一行没有t中的对应"时.我对吗?

那是正确的.