如何使 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 合并声明起作用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 google play store 上发布后 google 和 facebook 登录不起作用