Как мне обновить таблицу больших запросов с помощью массива? - PullRequest
1 голос
/ 19 марта 2020

У меня есть таблица с данными журнала, и я хочу обновить ее, используя результаты последующего запроса, который вставит результаты в отфильтрованную строку.

Я хочу использовать объединение всех, чтобы сохранить текущие значения и добавить новые, но я получаю следующую ошибку:

Коррелированные подзапросы, которые ссылаются на другие таблицы, не поддерживаются, если только они может быть декоррелирован, например, путем преобразования их в эффективное JOIN.

UPDATE LOGGING.table_logs a
SET a.pinged = ARRAY(
      (SELECT AS STRUCT 
      CURRENT_TIMESTAMP() as date,b.size_bytes,timestamp_millis(b.last_modified_time) AS last_modified_time,b.row_count
      FROM  `<DATASETNAME>.__TABLES__` b WHERE table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE())))

      )

WHERE table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE()))

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Ниже совсем не проверено и основано только на [надеюсь] правильной перетасовке синтаксиса - так что это позволяет избежать проблемы «коррелированных подзапросов, ссылающихся на другие таблицы»

UPDATE LOGGING.table_logs a
SET a.pinged = ARRAY(
  SELECT AS STRUCT 
    CURRENT_TIMESTAMP() AS DATE,
    b.size_bytes,
    TIMESTAMP_MILLIS(b.last_modified_time) AS last_modified_time,
    b.row_count
)
FROM  `<DATASETNAME>.__TABLES__` b 
WHERE a.table_id = b.table_id
AND a.table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE())) 

Пожалуйста, проверьте и дайте мне знать, работает ли он сейчас или все еще требуются некоторые корректировки

PS Очевидно, вышеизложенное предполагает, что остальные логики c верны

Обновление для : как сохранить то, что уже есть в a.ping, и обновить его тем, что есть в настоящее время плюс результат запроса?

Попробуйте ниже

UPDATE LOGGING.table_logs a
SET a.pinged = ARRAY_CONCAT(a.pinged, ARRAY(
  SELECT AS STRUCT 
    CURRENT_TIMESTAMP() AS DATE,
    b.size_bytes,
    TIMESTAMP_MILLIS(b.last_modified_time) AS last_modified_time,
    b.row_count
))
FROM  `<DATASETNAME>.__TABLES__` b 
WHERE a.table_id = b.table_id
AND a.table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE()))
0 голосов
/ 20 марта 2020

Я чувствую, что вы, возможно, чрезмерно упростили свой запрос, который для меня не выглядит коррелированным подзапросом, но если вы этого не сделаете, то, по вашему мнению, ваш подзапрос всегда генерирует один и тот же массив независимо от того, какая строка имеет LOGGING.table_logs. Вы можете сначала сохранить массив в переменной скрипта, а затем установить его:

DECLARE field_value DEFAULT 
ARRAY(
      (SELECT AS STRUCT 
      CURRENT_TIMESTAMP() as date,b.size_bytes,timestamp_millis(b.last_modified_time) AS last_modified_time,b.row_count
      FROM  `<DATASETNAME>.__TABLES__` b WHERE table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE()))));

UPDATE LOGGING.table_logs a
SET a.pinged = field_value
WHERE table_id = CONCAT("ga_sessions_intraday_",FORMAT_DATE("%Y%m%d", CURRENT_DATE()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...