如何将表 1 上的结构数组与 BigQuery 中表 2 的普通列连接起来

Posted

技术标签:

【中文标题】如何将表 1 上的结构数组与 BigQuery 中表 2 的普通列连接起来【英文标题】:How to Join Array of struct on table1 with normal column of table 2 in BigQuery 【发布时间】:2021-01-18 02:19:15 【问题描述】:

Tabel1 and Table 2

select p.id,q.description
from table1 p 
join table2 q 
on q.control_number 
in unnest(p.results.control_number)

当我处理这个时,我收到以下错误:

无法访问具有类型的值的字段 control_number ARRAY>

我也尝试过在表格之后取消嵌套,例如:

select p.id,q.f.description 
from table1 p,Unnest(finder) f 
join table2 q 
  on q.control_number in unnest(p.f.results.control_number)

但这也没有用。

谁能告诉我怎么了?

【问题讨论】:

【参考方案1】:

另一种选择

select p.id,q.description
from table1 p, table2 q 
where q.control_number in (select control_number from p.finder)

【讨论】:

嗨,米哈伊尔,感谢您努力帮助我。但是当我运行查询时,我只在一行中获取所有描述,而不是针对每个 control_number 和 Id。您能否建议我可能的修复这是我使用的查询,从 table1 p 中选择 p.finder,q.description,table2 q where q.control_number in (select control_number from p.finder) 你得到的正是你所要求的!在您的下一个问题中 - 请确保提供所有详细信息 - 示例输入、预期输出。等等查看How to create a Minimal, Reproducible Example。同时,我认为您的最初问题已得到充分回答:o)【参考方案2】:

在标准 SQL 中尝试以下操作:

with table1 as (
    select '1' id, array[struct('a1' as control_number)] finder
    UNION ALL 
    select '2' id, array[struct('a2' as control_number)] finder
    UNION ALL 
    select '3' id, array[struct('a3' as control_number)] finder     
),
table2 as (
    select 'description for a1' description, 'a1' control_number 
    UNION ALL
    select 'description for a2' description, 'a2' control_number 
)
select p.id,q.description 
from table1 p, unnest(p.finder) f join table2 q on q.control_number = f.control_number;

WITH 子句用于模拟表中的数据。

【讨论】:

感谢您帮助我。但是当我尝试运行此查询时,它运行了 5 分钟以上但还没有结果。我尝试停止它并重新运行,但没有提高性能。有什么改变吗?

以上是关于如何将表 1 上的结构数组与 BigQuery 中表 2 的普通列连接起来的主要内容,如果未能解决你的问题,请参考以下文章

如何在bigquery中连接两个结构数组?

如何在不破坏我的结构的情况下将特定单元格排除到 BigQuery 中的数组数组中?

将表从 google bigquery 导出到 google 存储

在 Bigquery 中,如何将结构的字符串化数组转换为正确的数组?

BigQuery:将表插入到具有分片表的现有 Google 分析中

无法从具有数组和结构的 BigQuery 表中提取键值对