我想根据源表(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
表?
答案 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') )