BigQuery:在某些情况下如何使MERGE操作失败?

时间:2019-03-05 12:20:00

标签: sql google-bigquery sql-update sql-merge

我想根据源表(target)中的行更新目标表(source)。为此,我使用了MERGE statement。但是,我希望整个MERGE操作在某些情况下会失败,但是无法弄清楚该怎么做。

示例

target表包含:

id
==
1
2

source表包含:

id | operation
==============
3  | ADD
4  | DELETE

target之后的预期MERGE表(我不想在这里进行任何更新,因为4对应于DELETE操作,并且从那里开始不是4表中的target行,这被认为是错误,MERGE应该自动失败):

id
==
1
2

截至目前,我使用以下请求:

MERGE `target` target
USING `source` source
ON target.id = source.id
WHEN not matched AND source.operation = "ADD" THEN
  INSERT (id)
  VALUES (source.id)

但是显然,我得到了:

id
==
1
2
3

是否可以在查询中添加像这样的子句:

WHEN not matched AND source.operation = "DELETE" THEN ERROR("...")

这不起作用(ERROR是意外的):

  

语法错误:预期的关键字DELETE或关键字INSERT或关键字UPDATE,但标识符为“ ERROR”

如果使用MERGE查询无法做到这一点,是否有办法将其重写为类似的查询,以便按我的意愿自动更新target表?

1 个答案:

答案 0 :(得分:1)

您可能会自己产生一个错误。像这样:

WHEN not matched AND source.operation = 'DELETE' THEN 
    INSERT (id)
       VALUES ( CAST(source.operation as int64) )

我没有故意尝试在BigQuery中生成错误,但是我不认为有一个函数可以自动这样做。

由@norbjd提议:

WHEN not matched AND source.operation = 'DELETE' THEN 
    INSERT (id)
       VALUES ( ERROR('ERROR:  DELETE operation encountered') )