Google bigquery 如何使用数组更新bigquery表?

Google bigquery 如何使用数组更新bigquery表?,google-bigquery,Google Bigquery,我有一个包含日志数据的表,我想用后续查询的结果对其进行更新,该查询将根据筛选的行插入结果 我想使用union all保留当前值并附加新值,但出现以下错误: 不支持引用其他表的相关子查询,除非它们可以取消相关,例如通过将它们转换为有效的联接 我觉得您可能过度简化了查询,这在我看来并不是相关的子查询,但如果您不这样做,我的感觉是您的子查询总是生成相同的数组,而不管LOGGING.table_logs有哪些行。您可以先将数组保存在脚本变量中,然后再进行设置: 声明字段值为默认值 大堆 选择为结构 当前

我有一个包含日志数据的表,我想用后续查询的结果对其进行更新,该查询将根据筛选的行插入结果

我想使用union all保留当前值并附加新值,但出现以下错误:

不支持引用其他表的相关子查询,除非它们可以取消相关,例如通过将它们转换为有效的联接


我觉得您可能过度简化了查询,这在我看来并不是相关的子查询,但如果您不这样做,我的感觉是您的子查询总是生成相同的数组,而不管LOGGING.table_logs有哪些行。您可以先将数组保存在脚本变量中,然后再进行设置:

声明字段值为默认值 大堆 选择为结构 当前时间戳为日期,b.大小字节,时间戳为毫秒b.上次修改时间为上次修改时间,b.行计数 从`.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\; 更新LOGGING.table_日志a 设置a.pinged=字段值 其中,表id=CONCATga\u sessions\u intrady\u,格式\u日期%Y%m%d,当前\u日期
下面的内容根本没有经过测试,只是基于[希望]正确的语法调整——所以它避免了引用其他表的相关子查询的问题

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())) 
请检查,让我知道它现在是否工作或仍然需要一些调整

注:显然,上述假设其余逻辑是正确的

更新目的:如何保留a.pinged中已经存在的内容,并使用当前存在的内容和查询结果进行更新

试试下面

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()))

嗨,Mikhail,我如何保留a.ping中已经存在的内容,并用当前存在的内容和查询结果进行更新?啊,是的,它确实有效。你是BQ大师!我会详细分析你的代码,真正理解你的不同做法。真的很感谢你花时间看这个。我不知道你是怎么做到这么好的。同时,检查我答案中的更新-希望这就是你需要的。谢谢你,我试图修改上面的代码以保留现有数据并附加新数据,但我无法让它工作。米哈伊尔设法使它按预期工作,但感谢你的帮助。
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()))