2011-02-01 60 views
10

我正在寻找甲骨文MERGE声明的确切解释。有人可以解释一下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 [, ...]) 
  • 进行什么样的加盟?我认为这是全外连接,对吗?
  • 关于WHEN MATCHED部分:当从t的行匹配s的多行时会发生什么?
  • 关于WHEN NOT MATCHED第一部分我认为这意味着“当s中的一行没有对应关系时t”。我对吗?

谢谢。

回答

11

不错的文章,进行什么样的加盟?我 认为它是全外连接,我是 对不对?

不,这是一个普通的外连接。查询需要知道目标表中是否存在同样位于源表中的行,以及源表中是否存在不在目标表中的记录。由于查询不需要响应目标表中但不在源表中的行,因此它不需要外部联接两种方式。

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

关于WHEN匹配的组件:当在T一排 多行从s匹配什么 发生什么呢?

当存在多个匹配时,将针对每个匹配执行更新。这意味着最后一次更新将会是提交中写入的更新。没有办法规定一个订单,所以在这种情况下,更新的来源是有效的(从一组匹配中)。

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

关于WHEN NOT MATCHED一部分,我相信 ,意思是“当个行有 在T没有对应”。我对吗?

这是正确的。

+0

谢谢,这正是我想知道的。我认为*常规的外部连接意味着'正确连接'而不是'不连接'? – Benoit 2011-02-01 15:10:27

相关问题