BigQuery 中的 Merge 语句等价于什么?

4

我正在从Teradata迁移到BigQuery。我遇到了一个在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”功能:https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#merge_statement - Graham Polley
1个回答

5

MERGE语句用于使用一个或多个主键(PK)从源表更新目标表

根据文档,Teradata和BigQuery MERGE之间的差异是:

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

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

在您的情况下,似乎您正在将PK作为DL.department_idV.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 表中的值。


1
谢谢你的帮助,Alex。我已经将USING子句转换为子查询,并解决了我的问题。 - Dhirendra Gautam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接