如何使 Google BQ 合并声明起作用?

Posted

技术标签:

【中文标题】如何使 Google BQ 合并声明起作用?【英文标题】:How do i make a Google BQ Merge Statement work? 【发布时间】:2021-03-22 11:30:20 【问题描述】:

我正在尝试使用 Merge 语句将源表的整个内容复制到目标表中的 SQL 语句。我正在尝试处理的流程是;检查源表中的一行数据是否存在于目标表中,如果它不执行任何操作,如果不执行,则将该行数据插入到源表中。

所以这是我目前拥有的代码,但它不能正常工作。

MERGE `myProject.myDataset.test_destination` T
USING `myProject.myDatatset.test_source` S
ON (T.department = S.department AND
   T.category = S.category AND
   T.subcategory = S.subcategory
   T.country = S.country AND
   T.state = S.state AND
   T.county = S.county AND 
   T.date = S.date)
WHEN NOT MATCHED THEN
  INSERT ROW

当我运行此查询时,我倾向于在目标上拥有比源上更多的数据。不应该是这样(它们应该是一样的)。

哦,是的,我忘了添加。该表没有唯一字段作为主键。我们使用复合字段来唯一标识每一行数据。

我将不胜感激任何形式的帮助..

【问题讨论】:

您应该调查您的数据。如果我不得不推测,我猜NULL 值是其中的一部分。 是的,涉及 NULL 值.. 大多数在子类别级别.. 【参考方案1】:

问题可能是NULL 值。如果是这样,您可以尝试将条件修改为

( (T.department = S.department OR t.department IS NULL and S.department IS NULL) AND
  (T.category = S.category OR t.category IS NULL and S.category IS NULL) AND
  . . .
)

但是,BQ 可能不喜欢这些条件。在这种情况下,请使用COALESCE()。您必须使用适合列的类型——并且不会干扰列值,但是:

( COALESCE(T.department, '<null>') = COALESCE(S.department, '<null>') AND
  . . .
)

或者转换成 JSON:

( to_json_string(T.department, t.category, . . .) = 
  to_json_string(S.department, S.category, . . .)
)

【讨论】:

太棒了..我会努力解决这个问题并回复你 这行得通.. 非常感谢.. 我使用了第一个使用 IS NULL 语句的建议.. 我将重构它以使用 COALESCE.. 再次感谢跨度> 无论如何我可以在这个查询中添加一个 WHERE 子句.. 有一个像 WHERE 源表上的部门这样的语句等于部门 = "FOOTBALL" @samlexxy 。 . . MERGE 不接受整体 WHERE 子句。但是,您可以在匹配条件中包含过滤器,这应该足够了。 无论如何我可以包含一个删除目标表上任何重复项的条件.. 比如当源不匹配并且(具有 COUNT(*) > 1)然后删除

以上是关于如何使 Google BQ 合并声明起作用?的主要内容,如果未能解决你的问题,请参考以下文章

将结算数据导出到 BigQuery 不起作用

为啥在 google play store 上发布后 google 和 facebook 登录不起作用

SQL Server:合并语句的更新部分不起作用

Google BQ:运行参数化查询,其中参数变量是BQ表目标

Firebase 动态链接,不起作用

在相同的气流执行中创建和删除 BQ 临时表,然后在下一次运行时先创建表但表删除不起作用