MERGE
根据目标表与另一个数据集(例如表或视图)的联接结果,对其执行更新和插入操作。联接只能将一个源行与一个目标行匹配;否则,Vertica 将返回错误。
如果合并会违反表或架构磁盘配额,操作将失败。有关详细信息,请参阅磁盘配额。
目标表不能包含复杂数据类型列。但源表可以,只要合并操作中不包含这些列。
语法
MERGE [ /*+LABEL (label‑string)*/ ]
INTO [[database.]schema.]target‑table [ [AS] alias ]
USING source‑dataset
ON join-condition matching‑clause[ matching‑clause ]
返回
更新或插入的目标表行数
参数
-
LABEL
将标签分配到语句,以便您可以在分析和调试时识别它。
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。-
目标表
- 对其执行更新和插入操作的表。MERGE 在操作中对目标表进行 X(互斥)锁。表不得包含复杂类型列。
重要
目标表列总数不得超过 831。 - source‑dataset
- 要联接到 target-table 的数据,为以下几项之一:
-
[[database.]schema.]table [ [AS] alias ]
-
[[database.]schema.]view [ [AS] alias ]
-
(subquery) sq-alias
指定的数据集通常提供用于更新目标表和填充新行的数据。可以指定一个外部表。
-
-
ON join‑condition
- 联接目标表和源数据集的条件。
- matching‑clause
- 以下子句之一:
MERGE 支持每个子句的一个实例,且必须至少包含一个实例。
-
WHEN MATCHED THEN UPDATE
- 对于联接(匹配)到 source‑dataset 的每个target‑table 行,指定更新一列或多列:
WHEN MATCHED [ AND update-filter ] THEN UPDATE SET { column = expression }[,...]
update-filter 选择性地筛选匹配行的集合。更新筛选器可以指定任意数量的条件。Vertica 会根据此筛选器评估每个匹配行,并仅更新评估为 true 的行。有关详细信息,请参阅更新和插入筛选器。
注意
Vertica 还支持用于指定更新筛选器的 Oracle 语法:
WHEN MATCHED THEN UPDATE SET { <span class="code-variable">column</span> = <span class="code-variable">expression</span> }[,...] [ WHERE <span class="code-variable">update‑filter </span>]
需要满足以下要求:
-
MERGE 语句只能包含一个 WHEN MATCHED 子句。
-
target‑column 只能指定目标表中的列名称。不能用表名称来限定。
有关详细信息,请参阅合并表数据。
-
-
WHEN NOT MATCHED THEN INSERT
- 对于每个未联接到(未匹配)到 target‑table 的 source‑dataset 行,指定:
-
在 target-table 中插入一个新行。
-
使用 values‑list 中指定的值填充每个新行。
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 值映射到列。
insert-filter 选择性地筛选不匹配的行集。插入筛选器可以指定任意数量的条件。Vertica 根据此筛选器评估每个不匹配的源行。对于计算结果为 true 的每一行,Vertica 都会在目标表中插入一个新行。有关详细信息,请参阅更新和插入筛选器。
注意
Vertica 还支持用于指定插入筛选器的 Oracle 语法:
WHEN NOT MATCHED THEN INSERT [ ( <span class="code-variable">column‑list</span> ) ] VALUES ( <span class="code-variable">values‑list</span> [ WHERE <span class="code-variable">insert‑filter </span>]
需要满足以下要求:
-
MERGE 语句只能包含一个 WHEN NOT MATCHED 子句。
-
column‑list 只能指定目标表中的列名称。不能用表名称来限定。
-
插入筛选条件只能引用源数据。如果任何条件引用目标表,Vertica 将返回错误。
有关详细信息,请参阅合并表数据。
-
特权
MERGE 需要以下权限:
-
对源数据的 SELECT 权限以及对目标表的 INSERT、UPDATE 和 DELETE 权限。
-
自动约束强制执行要求具有对限制的表的 SELECT 权限。
-
如果语法中的条件从目标表中读取数据,则需要具有对目标表的 SELECT 权限。
例如,以下 GRANT 语句授予 user1
对 t2
表的访问权限。这将允许 user1
运行以下 MERGE 语句:
=> GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE t2 to user1;
GRANT PRIVILEGE
=>\c - user1
You are now connected as user "user1".
=> MERGE INTO t2 USING t1 ON t1.a = t2.a
WHEN MATCHED THEN UPDATE SET b = t1.b
WHEN NOT MATCHED THEN INSERT (a, b) VALUES (t1.a, t1.b);
改善 MERGE 性能
您可以通过多种方式改善 MERGE 性能:
-
使用小于目标表的源数据集。
有关详细信息,请参阅MERGE 优化。
如果在目标表中启用了主键、唯一键或检查约束以自动强制实施,Vertica 会在您加载新数据时强制实施这些约束。如果发生违规,Vertica 会回滚操作并返回错误。
当心
如果使用相同的目标和源表多次运行 MERGE,则每次迭代都有可能将重复值引入目标列并返回错误。禁止合并的列
合并操作中不能指定以下列,否则将返回错误:
-
Identity/auto-increment 列,或默认值设置为命名序列的列。
-
Flex 表中的 Vmap 列,例如
__raw__
。 -
复杂类型的列(ARRAY、SET、ROW)。
示例
请参阅: