合并语句的 BigQuery 等效项

Posted

技术标签:

【中文标题】合并语句的 BigQuery 等效项【英文标题】:BigQuery Equivalent of Merge Statement 【发布时间】:2020-06-20 09:39:38 【问题描述】:

我正在执行从 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 的等价物。

【问题讨论】:

BigQuery 有 MERGE: cloud.google.com/bigquery/docs/reference/standard-sql/… 【参考方案1】:

MERGE 语句用于使用带有一个或多个主键 (PK) 的 source table 更新 target table

根据documentation,Teradata 和 BigQuery 的 MERGE 的区别是:

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

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

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

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 中的值。

【讨论】:

感谢 Alex 的帮助,我还将 USING 子句转换为子查询,它解决了我的问题

以上是关于合并语句的 BigQuery 等效项的主要内容,如果未能解决你的问题,请参考以下文章

Bigquery DML - SQL 输出

是否有 C# 空合并运算符的 Python 等效项?

case/switch 语句的 Python 等效项是啥? [复制]

Bigquery Standard Sql 等效于 Legacy Sql 中的 LAST()

带变量的 SQL 编译语句的 SparkSQL 等效项

在 WHERE 子句中使用函数编写 SQL SELECT 语句是不是有 Django 等效项?