MERGE 匹配子句

MERGE 支持以下匹配子句的一个实例:

  • [WHEN MATCHED THEN UPDATE SET](#WHEN_MATCHED)
  • [WHEN NOT MATCHED THEN INSERT](#WHEN_NOT_MATCHED)

每个匹配子句都可以指定一个附加筛选器,如更新和插入筛选器中所述。

WHEN MATCHED THEN UPDATE SET

通常使用源表中的数据更新联接到源表的所有目标表行:

WHEN MATCHED [ AND update-filter ] THEN UPDATE
   SET { target‑column = expression }[,...]

Vertica 只能对源表的联接列中的唯一值执行联接。如果源表的联接列包含多个匹配值,MERGE 语句将返回运行时错误。

WHEN NOT MATCHED THEN INSERT

WHEN NOT MATCHED THEN INSERT 会为从联接中排除的每个源表行向目标表中插入一个新行:

WHEN NOT MATCHED [ AND insert-filter ] THEN INSERT
   [ ( column‑list ) ] VALUES ( values‑list )

column‑list 是目标表中一个或多个目标列的逗号分隔列表,按任意顺序列出。 MERGE 按相同的顺序将 column‑list 列映射到 values‑list 值,并且每个列-值对都必须兼容。如果省略 column‑list,Vertica 会根据表定义中的列顺序将 values‑list 值映射到列。

例如,给定以下源表和目标表定义:

CREATE TABLE t1 (a int, b int, c int);
CREATE TABLE t2 (x int, y int, z int);

以下 WHEN NOT MATCHED 子句在新插入的行中隐式设置目标表列 abc 的值:

MERGE INTO t1 USING t2 ON t1.a=t2.x
   WHEN NOT MATCHED THEN INSERT VALUES (t2.x, t2.y, t2.z);

相反,以下 WHEN NOT MATCHED 子句从合并操作中排除列 t1.bt2.yWHEN NOT MATCHED 子句显式将目标表和源表中的两组列进行配对: t1.at2.x 以及 t1.ct2.z。Vertica 将排除的列 t1.b 设置为 Null:

MERGE INTO t1 USING t2 ON t1.a=t2.x
   WHEN NOT MATCHED THEN INSERT (a, c) VALUES (t2.x, t2.z);