BigQuery 相当于合并语句



我正在执行从 teradata 到 Big query 的迁移。我遇到了一个在 USING 子句中具有值的合并语句。

MERGE INTO department DL
USING VALUES
(
2,'ABC'
) AS V 
(Run_Id, Country) 
ON DL.department_id = V.Run_Id
WHEN MATCHED THEN
UPDATE SET 
department_description = V.country
WHEN NOT MATCHED THEN
INSERT
(
V.Run_Id
, V.Country
curr
); 

谁能帮我找到它的 BigQuery 等效物。

当您想要使用具有一个或多个主键 (PK( 的source table更新target table时,将使用MERGE语句。

根据文档,Teradata和BigQuery的MERGE之间的区别是:

Teradata 的 MERGE 操作仅限于匹配 一个接入模块处理器 (AMP(。相比之下,BigQuery没有大小。 或合并操作的列限制,因此使用 MERGE 是一个 有用的优化。但是,如果 MERGE 主要是一个大 删除,请参阅本文档其他地方的 DELETE 优化。

BigQuery 中的 DML 脚本具有略有不同的一致性语义 比 Teradata 中的等效语句。例如,Teradata的SET 会话模式下的表可能会在合并期间忽略重复项 操作。有关处理 MULTISET 和 SET 表的概述, 快照隔离以及会话和事务处理,请参阅 创建索引部分在本文档的其他位置。

在您的情况下,您似乎正在使用PK作为DL.department_idV.Run_Id。虽然,在USING子句的语法中,您应该指定目标表,而不仅仅是其字段。以下是语法,链接:

MERGE target_name [[AS] alias]
USING source_name
ON merge_condition
#WHEN MATCHED 
#WHEN NOT MATCHED

因此,在您的情况下,语法将是:

MERGE dataset.department DL
USING (SELECT * FROM `project_id.dataset.source_table`) V
ON DL.department_id = V.Run_Id
WHEN MATCHED THEN
UPDATE SET DL.department_description = V.country
WHEN NOT MATCHED
#first specify the name of the columns in your then the values to insert
INSERT(colum1, column2, column3) VALUES(V.Run_Id, V.Country, V.curr)

请注意,在INSERT子句中,首先指定要添加数据的列,然后在要插入的值VALUES中,可以显式写入值或使用要添加的数据命名source_table中的列。我想指出的是,我认为curr是源表中的一列。此外,您没有说明源表,只说明了其中的一些字段。

为了进一步澄清,下面是另一个例子

MERGE `dataset.target_table` T
USING (SELECT "New value" as value, "1" as ID) S
ON T.ID = S.ID
WHEN MATCHED THEN
UPDATE SET T.value_column = S.value
WHEN NOT MATCHED THEN
INSERT(value_column, id) VALUES("Value added", s.ID)

同样,请注意INSERT子句,首先描述目标表中的列,然后描述将在表WHEN NOT MATCHED中插入的值。

最新更新