Google BigQuery - Обновление вложенных полей Доход - PullRequest
0 голосов
/ 07 ноября 2018

Я пытался применить решение в Google BigQuery - Обновление вложенного повторного поля в поле hit.transaction.transactionRevenue, но я получаю сообщение об ошибке:

Скалярный подзапрос сгенерирован более чем на один элемент

Я попытался выполнить следующий запрос:

UPDATE `project_id.dataset_id.table`
SET hits = ARRAY(
  SELECT AS STRUCT * REPLACE (
    (SELECT AS STRUCT transaction.* REPLACE (1 AS transactionRevenue)) AS transaction
  )
  FROM UNNEST(hits) as transactionRevenue
)
WHERE (select h.transaction.transactionId from unnest(hits) as h) LIKE 'ABC123XYZ'

Есть ли очевидные ошибки с моей стороны? Было бы здорово, если бы кто-нибудь мог поделиться некоторыми советами или опытом, которые могли бы помочь мне в этом.

Что я в основном хочу сделать, это установить доход от конкретной транзакции равным 1.

Большое спасибо заранее,

David

1 Ответ

0 голосов
/ 07 ноября 2018

Это проблема:

WHERE (select h.transaction.transactionId from unnest(hits) as h) LIKE 'ABC123XYZ'

Если в массиве более одного попадания, это приведет к появившейся ошибке. Вы, вероятно, хотите вместо этого:

WHERE EXISTS (select 1 from unnest(hits) as h WHERE h.transaction.transactionId LIKE 'ABC123XYZ')

Но учтите, что ваше ОБНОВЛЕНИЕ теперь заменит все элементов массива для любой строки, где это условие истинно. Вместо этого вы можете переместить условие в вызов функции ARRAY:

UPDATE `project_id.dataset_id.table`
SET hits = ARRAY(
  SELECT AS STRUCT * REPLACE (
    (SELECT AS STRUCT transaction.* REPLACE (1 AS transactionRevenue)) AS transaction
  )
  FROM UNNEST(hits) as h
  WHERE h.transaction.transactionId LIKE 'ABC123XYZ'
)
WHERE true

Теперь замена будет применяться только к попаданиям с идентификатором транзакции, соответствующим шаблону.

...