如何使Google BQ合并声明生效



我正在尝试使用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

当我运行此查询时,问题是我在Destination上的数据往往多于Source。不应该是这样(它们应该是一样的(。

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

我将感谢任何形式的帮助。。

问题可能是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, . . .)
)

最新更新