【问题标题】:How do i make a Google BQ Merge Statement work?如何使 Google BQ 合并声明起作用?
【发布时间】: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 值.. 大多数在子类别级别..

标签: sql google-bigquery


【解决方案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)然后删除
猜你喜欢
  • 2021-08-17
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 2015-08-13
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多