BigQuery 相关子查询 - 将数组转换为数组
Posted
技术标签:
【中文标题】BigQuery 相关子查询 - 将数组转换为数组【英文标题】:BigQuery correlated subqueries - transform array to array 【发布时间】:2021-06-14 12:21:02 【问题描述】:我正在尝试在 BigQuery 中加入数组元素,但收到以下错误消息:
不支持引用其他表的相关子查询 除非它们可以去相关,例如通过将它们转换为 高效的 JOIN。
在我的第一张桌子上,我有类似的东西:
字段1 |字段2 |一些列表
some_list 中的元素具有 id 和其他数据,我想用不同表中的一些字段(它们可能存在或不存在)来丰富 some_list 中的每个元素。 我尝试取消嵌套 some_list 并在 id 上使用不同的表离开 join,但似乎不允许这样做。
任何想法我该怎么做?谢谢!
第一个表:
day city orders.id orders.address
14-06-2021 London 1 abc
2 def
3 ghi
14-06-2021 Bristol 4 sfd
5 sds
第二张桌子:
order.id order.weight
1 10
2 12
3 35
5 31
预期结果:
day city orders.id orders.address orders.weight
14-06-2021 London 1 abc 10
2 def 12
3 ghi 35
14-06-2021 Bristol 4 sfd NULL
5 sds 31
【问题讨论】:
样本数据和期望的结果会有所帮助。 好的,我会更新我原来的问题 【参考方案1】:考虑以下通用解决方案
select any_value(t1).* replace(
array_agg((select as struct t.*, `order`.weight)) as orders
)
from first_table t1, t1.orders t
left join second_table t2
on id = `order`.id
group by to_json_string(t1)
如果应用于您问题中的样本数据 - 输出是
【讨论】:
【参考方案2】:试试这个:
with first_table as (
select '14-06-2021' as day, 'London' as city, [struct(1 as id, 'abc' as address), (2, 'def'), (3, 'ghi')] as orders union all
select '14-06-2021' as day, 'Bristol' as city, [struct(4 as id, 'sfd' as address), (5, 'sds')] as orders
),
second_table as (
select struct(1 as id, 10 as weight) as `order` union all
select struct(2 as id, 12 as weight) as `order` union all
select struct(3 as id, 35 as weight) as `order` union all
select struct(5 as id, 31 as weight) as `order`
)
select day, city, array_agg(struct(o.id as id, o.address as address, s.order.weight as weight)) as orders
from first_table, unnest(orders) as o left join second_table as s on o.id = s.order.id
group by day, city
【讨论】:
它也能完成这项工作,谢谢!但实际上我的 first_table 有更多列,我不确定按所有列分组是否是一个不错的解决方案。【参考方案3】:这应该可以正常工作,并且似乎符合您的描述:
select t.*,
(select array_agg(coalesce(ot.other_value, el))
from unnest(t.some_list) el left join
othertable ot
on ot.key = el.key
) as new_list
from t;
【讨论】:
以上是关于BigQuery 相关子查询 - 将数组转换为数组的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery 中使用引用另一个表的 UDF 的相关子查询错误
将查询构建器条件转换为 MongoDB 操作,包括嵌套的子文档数组