GCP Bigquery 中的动态合并

问题描述

我在 GCP Bigquery 中有一个主表和一个临时表。主表将包含快照数据,临时表将是一个流表。我想运行合并查询并每隔一定时间更新主表中的数据。

由于我将使用 MongoDB Debezium 连接器,因此我只会接收一行的更新列,其余列将为空。

正常的合并查询会更新整行,这是不受欢迎的。

我需要一种方法来合并表中仅针对那些特定列的行,并保持其余列不变。每行要更新的列可以不同。

例如:

Main table data:
id  status  login_id    task_id user_id
71  CLaimED 13          4373737 2191


Staging table data:
id  status  login_id    task_id user_id
71  null    null        4636282 null

我想要这样的结果:

id  status  login_id    task_id user_id
71  CLaimED 13          4636282 2191

查询必须为新键插入记录并为现有键更新特定列

有可能吗?任何人都可以帮助我吗?

解决方法

下面的查询应该可以工作。您需要为每列创建一个 match 子句,而不是使用单个子句来更新 WHEN MATCHED 上的整行。 WHEN NOT MATCHED BY TARGET 部分保持不变以插入新条目。

merge main T 
using staging S
on T.id = S.id
when matched and S.status is not null then update set T.status = cast(S.status as string)
when matched and S.login_id is not null then update set T.login_id = S.login_id
when matched and S.task_id is not null then update set T.task_id = S.task_id
when matched and S.user_id is not null then update set T.user_id = S.user_id
when not matched by target then insert values (S.id,cast(S.status as string),S.login_id,S.task_id,S.user_id)

我测试了它并且它有效。您可能需要强制转换一些列,因为如果 S 具有 null 值且 T 为 int 列,bigquery 会抱怨。