BigQuery: как сделать так, чтобы операция MERGE не сработала при некоторых условиях? - PullRequest
0 голосов
/ 05 марта 2019

Я хочу обновить целевую таблицу (target) в соответствии со строками в исходной таблице (source). Для этого я использую оператор MERGE . Тем не менее, я хотел бы, чтобы вся операция MERGE не выполнялась при некоторых условиях, но не могу понять, как это сделать.

Пример

Таблица target содержит:

id
==
1
2

Таблица source содержит:

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

Ожидается target таблица после MERGE (я не хочу каких-либо обновлений здесь, потому что 4 соответствует операции DELETE, и поскольку в * 1026 нет строки 4 * таблица, это считается ошибкой и 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 Ответ

1 голос
/ 05 марта 2019

Вы можете создать ошибку самостоятельно. Что-то вроде:

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') )
...