google-bigquery - 合并语句的 BigQuery 等价物

标签 google-bigquery merge-statement bigquery-udf

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

最佳答案

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

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

Teradata's MERGE operation is limited to matching primary keys within one access module processor (AMP). In contrast, BigQuery has no size or column limitation for MERGE operations, therefore using MERGE is a useful optimization. However, if the MERGE is primarily a large delete, see optimizations for DELETE elsewhere in this document.

DML scripts in BigQuery have slightly different consistency semantics than equivalent statements in Teradata. For example, Teradata's SET tables in session mode might ignore duplicates during a MERGE operation. For an overview on handling MULTISET and SET tables, snapshot isolation, and session and transaction handling, see the CREATE INDEX section elsewhere in this document.

在您的情况下,您似乎正在使用 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

关于google-bigquery - 合并语句的 BigQuery 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62484110/

相关文章:

database - 直接从 Hadoop/HDFS(本地/本地集群)将数据加载到 Redshift 和 Bigquery

google-bigquery - 我无法在 Bigquery 中创建临时表

sql - 从大查询中的特定数字开始查找序列

google-bigquery - 在BigQuery中动态查询多个表

python - 在Python/Airflow中加密数据并在BigQuery中解密的方法

sql - 每行或每条语句的 MERGE 语句唯一索引/约束验证?

sql - 合并 SQL 多个插入语句不是一个选项

sql - 如何向 SQL Server Merge 语句添加 where 条件以进行删除

sql - 在 BigQuery 中查找重叠的时间段