Dhi*_*tam 4 merge-statement google-bigquery bigquery-udf
我正在执行从 Teradata 到 Big query 的迁移。我遇到过在 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
);
Run Code Online (Sandbox Code Playgroud)
谁能帮我找到它的 BigQuery 等效项。
当您想要使用一个或多个主键 (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 asDL.department_id和V.Run_Id。尽管如此,在USING子句的语法中,您应该指定目标表而不仅仅是其字段。以下是语法,链接:
MERGE target_name [[AS] alias]
USING source_name
ON merge_condition
#WHEN MATCHED
#WHEN NOT MATCHED
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,语法将是:
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)
Run Code Online (Sandbox Code Playgroud)
请注意,在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)
Run Code Online (Sandbox Code Playgroud)
再次注意该INSERT子句,首先描述目标表中的列,然后描述将插入到表中的值WHEN NOT MATCHED。
| 归档时间: |
|
| 查看次数: |
9806 次 |
| 最近记录: |