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
子句在新插入的行中隐式设置目标表列 a
、b
和 c
的值:
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.b
和 t2.y
。WHEN NOT MATCHED
子句显式将目标表和源表中的两组列进行配对: t1.a
对 t2.x
以及 t1.c
对 t2.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);