更新和插入筛选器
MERGE
语句中的每个 WHEN MATCHED
和 WHEN NOT MATCHED
子句都可以选择分别指定更新筛选器和插入筛选器:
WHEN MATCHED AND update-filter THEN UPDATE ...
WHEN NOT MATCHED AND insert-filter THEN INSERT ...
Vertica 还支持用于指定更新和插入筛选器的 Oracle 语法:
WHEN MATCHED THEN UPDATE SET column-updates WHERE update-filter
WHEN NOT MATCHED THEN INSERT column-values WHERE insert-filter
每个筛选器都可以指定多个条件。Vertica 按如下方式处理筛选器:
-
更新筛选器应用于目标表中由
MERGE
联接返回的匹配行集。对于更新筛选器求值结果为 true 的每一行,Vertica 都会更新指定的列。 -
插入筛选器应用于从
MERGE
联接中排除的源表行集。对于插入筛选器求值结果为 true 的每一行,Vertica 都会向目标表中添加一个具有指定值的新行。
例如,给定表 t11
和 t22
中的以下数据:
=> SELECT * from t11 ORDER BY pk;
pk | col1 | col2 | SKIP_ME_FLAG
----+------+------+--------------
1 | 2 | 3 | t
2 | 3 | 4 | t
3 | 4 | 5 | f
4 | | 6 | f
5 | 6 | 7 | t
6 | | 8 | f
7 | 8 | | t
(7 rows)
=> SELECT * FROM t22 ORDER BY pk;
pk | col1 | col2
----+------+------
1 | 2 | 4
2 | 4 | 8
3 | 6 |
4 | 8 | 16
(4 rows)
可以使用以下 MERGE
语句将表 t11
中的数据合并到表 t22
中,其中包括更新和插入筛选器:
=> MERGE INTO t22 USING t11 ON ( t11.pk=t22.pk )
WHEN MATCHED
AND t11.SKIP_ME_FLAG=FALSE AND (
COALESCE (t22.col1<>t11.col1, (t22.col1 is null)<>(t11.col1 is null))
)
THEN UPDATE SET col1=t11.col1, col2=t11.col2
WHEN NOT MATCHED
AND t11.SKIP_ME_FLAG=FALSE
THEN INSERT (pk, col1, col2) VALUES (t11.pk, t11.col1, t11.col2);
OUTPUT
--------
3
(1 row)
=> SELECT * FROM t22 ORDER BY pk;
pk | col1 | col2
----+------+------
1 | 2 | 4
2 | 4 | 8
3 | 4 | 5
4 | | 6
6 | | 8
(5 rows)
Vertica 按如下方式使用更新和插入筛选器:
-
根据更新筛选器条件对所有匹配的行进行求值。Vertica 会更新以下两个条件的求值结果均为 true 的每一行:
-
源列
t11.SKIP_ME_FLAG
设置为 false。 -
COALESCE
函数的求值结果为 true。
-
-
根据插入筛选器,对源表中所有不匹配的行进行求值。对于列
t11.SKIP_ME_FLAG
设置为 false 的每一行,Vertica 都会在目标表中插入一个新行。