Google bigquery 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"),
不支持引用其他表的相关子查询,除非它们可以取消相关,例如将它们转换为有效联接。
假设我有两个映射表:
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