1

我正在执行从 teradata 到大查询的迁移。我遇到了一个在 USING 子句中有 VALUES 的合并语句。

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 等价物。

4

1 回答 1

2

当您想要使用一个或多个主键 (PK)更新 a 时,使用MERGE语句。target tablesource table

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

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

BigQuery 中的 DML 脚本的一致性语义与 Teradata 中的等效语句略有不同。例如,会话模式下的 Teradata SET 表可能会在 MERGE 操作期间忽略重复项。有关处理 MULTISET 和 SET 表、快照隔离以及会话和事务处理的概述,请参阅本文档其他地方的 CREATE INDEX 部分。

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

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

于 2020-06-22T08:01:26.527 回答