我正在执行从 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_id
和V.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
中插入的值。