我正在寻找甲骨文中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
中没有对应关系时,它意味着“。我是对的吗?谢谢。
答案 0 :(得分:11)
执行什么样的连接?一世 认为这是完全外联,我 正确?
不,这是一个常规的外部联接。查询需要知道目标表中的行何时也在源表中,以及源表中是否有不在目标表中的记录。由于查询不需要响应目标表中但不在源表中的行,因此不需要外部联接双向进行。
但是,如果没有not matched
子句(完全有效),则不会执行外连接。优化器足够聪明,知道在这种情况下,内连接就足够了。
关于WHEN MATCHED部分:什么 当来自t的一行匹配时发生 来自s的多行?
当有多个匹配项时,将对每个匹配项执行更新。这意味着最后一次更新将是提交中写入的更新。没有办法规定订单,所以在这种情况下,更新的来源实际上是随机的(来自匹配集)。
@ Vincent Malgrat指出,这是不正确的。如果有多个匹配项,Oracle似乎会生成“ORA-40926:无法在源表中获取稳定的行集”错误。
关于WHEN NOT MATCHED第一部分 相信这意味着“当s中有一排时 在t“没有对应关系。我是对的吗?
这是正确的。
答案 1 :(得分:2)