问题描述
我在 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 会抱怨。