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(互斥)锁。表不得包含复杂类型列。
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 的行。有关详细信息,请参阅更新和插入筛选器

需要满足以下要求:

  • MERGE 语句只能包含一个 WHEN MATCHED 子句。

  • target‑column 只能指定目标表中的列名称。不能用表名称来限定。

有关详细信息,请参阅合并表数据

WHEN NOT MATCHED THEN INSERT
对于每个未联接到(未匹配)到 target‑tablesource‑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 都会在目标表中插入一个新行。有关详细信息,请参阅更新和插入筛选器

需要满足以下要求:

  • MERGE 语句只能包含一个 WHEN NOT MATCHED 子句。

  • column‑list 只能指定目标表中的列名称。不能用表名称来限定。

  • 插入筛选条件只能引用源数据。如果任何条件引用目标表,Vertica 将返回错误。

有关详细信息,请参阅合并表数据

特权

MERGE 需要以下权限:

  • 对源数据的 SELECT 权限以及对目标表的 INSERTUPDATEDELETE 权限。

  • 自动约束强制执行要求具有对限制的表的 SELECT 权限。

  • 如果语法中的条件从目标表中读取数据,则需要具有对目标表的 SELECT 权限。

例如,以下 GRANT 语句授予 user1t2 表的访问权限。这将允许 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 会回滚操作并返回错误。

禁止合并的列

合并操作中不能指定以下列,否则将返回错误:

示例

请参阅:

另请参阅