Google bigquery BigQuery-相关子查询未测试数组不工作

Google bigquery BigQuery-相关子查询未测试数组不工作,google-bigquery,Google Bigquery,我正在尝试在BigQuery中联接数组元素,但收到以下错误消息:不支持引用其他表的相关子查询,除非它们可以取消相关,例如将它们转换为有效联接。 假设我有两个映射表: CREATE OR REPLACE TABLE `test.field_id_name` ( id STRING, name STRING ) AS ( SELECT * FROM UNNEST( [STRUCT("s1", "string1"), STRUCT("s2", "string2"),

我正在尝试在BigQuery中联接数组元素,但收到以下错误消息:
不支持引用其他表的相关子查询,除非它们可以取消相关,例如将它们转换为有效联接。

假设我有两个映射表:

CREATE OR REPLACE TABLE `test.field_id_name` (
  id STRING,
  name STRING
) AS (
  SELECT * FROM UNNEST(
     [STRUCT("s1", "string1"),
     STRUCT("s2", "string2"),
     STRUCT("s3", "string3")]
  )
)
我有以下作为输入:

CREATE OR REPLACE TABLE `test.input` AS
  SELECT [
    STRUCT<id STRING, value ARRAY<STRING>>("s1", ["v1"]),
    STRUCT("s2", ["v1"]),
    STRUCT("s3", ["v1"])
  ] records
  UNION ALL
  SELECT [
    STRUCT("s1", ["v1", "v2"]),
    STRUCT("s2", ["v1", "v2"]),
    STRUCT("s3", ["v1", "v2"])
  ]
  UNION ALL
  SELECT [
    STRUCT("s1", ["v1", "v2", "v3"]),
    STRUCT("s2", ["v1", "v2", "v3"]),
    STRUCT("s3", ["v1", "v2", "v3"])
  ]

下面是BigQuery标准SQL

#standardSQL
SELECT ARRAY_AGG(STRUCT(id AS id_mapped, val AS value_mapped)) AS records
FROM (
  SELECT fin.name AS id, ARRAY_AGG(fv.name) AS val, FORMAT('%t', t) id1, FORMAT('%t', RECORD) id2
  FROM `test.input` t,
  UNNEST(records) record,
  UNNEST(value) val
  JOIN `test.field_id_name` fin ON record.id = fin.id
  JOIN `test.field_values` fv ON val = fv.id
  GROUP BY id, id1, id2
)
GROUP BY id1   

如果要应用于您问题中的样本数据-返回您期望的准确输出

请提供样本数据和期望结果。Hi@MikhailBerlyant-添加了具有所需转换的样本数据在我看来非常混乱:o(我甚至无法将样本数据与提供的查询进行匹配!请您重新编写您的问题,以便我们能够清楚地看到1)输入数据样本2)预期输出样本匹配呈现的输入3)到目前为止您的代码以及您对它有什么问题,请欣赏反馈。我已经修改了这个问题,希望更清楚!快速看一眼,现在看起来好多了。等有时间的时候会更仔细地看(除非有人已经回答):o)不知道你是如何想出这样的解决方案的。你是一个魔术师,请考虑投票的答案-这是很重要的在这里,所以:o) 作为魔术师——当你在过去的40多年里日复一日地做这些事情时——你不做魔术——你只是机械地应用模式…:o)
SELECT [
  STRUCT<id_mapped STRING, value_mapped ARRAY<STRING>>("string1", ["val1"]),
  STRUCT("string2", ["val1"]),
  STRUCT("string3", ["val1"])
] records
UNION ALL
SELECT [
  STRUCT("string1", ["val1", "val2"]),
  STRUCT("string2", ["val1", "val2"]),
  STRUCT("string3", ["val1", "val2"])
]
UNION ALL
SELECT [
  STRUCT("string1", ["val1", "val2", "val3"]),
  STRUCT("string2", ["val1", "val2", "val3"]),
  STRUCT("string3", ["val1", "val2", "val3"])
]
SELECT
  ARRAY(
    SELECT
      STRUCT(fin.name, ARRAY(SELECT fv.name FROM UNNEST(value) v JOIN test.field_values fv ON (v = fv.id)))
    FROM UNNEST(records) r
    JOIN test.field_id_name fin ON (fin.id = r.id)
  )
FROM test.input
#standardSQL
SELECT ARRAY_AGG(STRUCT(id AS id_mapped, val AS value_mapped)) AS records
FROM (
  SELECT fin.name AS id, ARRAY_AGG(fv.name) AS val, FORMAT('%t', t) id1, FORMAT('%t', RECORD) id2
  FROM `test.input` t,
  UNNEST(records) record,
  UNNEST(value) val
  JOIN `test.field_id_name` fin ON record.id = fin.id
  JOIN `test.field_values` fv ON val = fv.id
  GROUP BY id, id1, id2
)
GROUP BY id1