合并语句的 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_id
和V.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 等效项的主要内容,如果未能解决你的问题,请参考以下文章
case/switch 语句的 Python 等效项是啥? [复制]