Sql 如何在BigQuery上更新重复的非记录字段?

Sql 如何在BigQuery上更新重复的非记录字段?,sql,google-bigquery,Sql,Google Bigquery,我已经看到了关于如何更新一个列的问题,该列是重复记录类型的数据,所有这些都使用structs,但是我找不到如何更新一个列,该列只是一个重复字符串类型,并且是使用array_agg函数生成的 我尝试执行的更新基于另一个表。在表A中,我有两列:id和电话号码。phone_number是列的数组_agg类型。在表B中,我有很多ID和更多电话号码,但表中没有任何数组。这只是一张普通的桌子,没有什么特别的东西 表B上的两种列类型都是可为空的字符串。在表A中,唯一的id是一个可为空的字符串,电话号码是一个重

我已经看到了关于如何更新一个列的问题,该列是重复记录类型的数据,所有这些都使用structs,但是我找不到如何更新一个列,该列只是一个重复字符串类型,并且是使用array_agg函数生成的

我尝试执行的更新基于另一个表。在表A中,我有两列:id和电话号码。phone_number是列的数组_agg类型。在表B中,我有很多ID和更多电话号码,但表中没有任何数组。这只是一张普通的桌子,没有什么特别的东西

表B上的两种列类型都是可为空的字符串。在表A中,唯一的id是一个可为空的字符串,电话号码是一个重复的字符串

当使用查询创建表A时,phone_number列被限制为仅5个数字数组\u aggphone limit 5 as phone_number

如何根据表B上的ID和数字更新表A中的数字?我想更新表A的电话号码,表B上有ID

到目前为止,我尝试的是:

update `table_A`
set phone_number = array(
    select phone_number from (
    select phone_number ,row_number() over(partition by id) rnum
    from `table_B` 
    
    )
    where rnum <= 5
    
    )
where id in (select distinct id from `table_B`)

要添加到每个id的电话号码为:

select b.id, array_agg(b.phone_number)
from `table_B` b
where b.phone_number not in (select a.pn
                             from `table_A` a cross join
                                  unnest(a.phone_numbers) pn
                             where a.id = b.id 
                            )
group by b.id
您可以将其合并到更新中,并将数组相互追加:

update `table_A` a
    set a.phone_numbers = array_concat(a.phone_numbers, b.phone_numbers)
    from (select b.id, array_agg(b.phone_number) as phone_numbers
          from `table_B` b
          where b.phone_number not in (select a.pn
                                       from `table_A` a cross join
                                            unnest(a.phone_numbers) pn
                                       where a.id = b.id 
                                      )
          group by b.id
         ) b
    where b.id = a.id

样本数据和期望的结果将使问题更容易理解。谢谢你,先生。这就成功了。为什么我需要使用array\u concat而不是array\u agg?@xerac。因为数组_agg用于聚合查询。这段代码只是将基本上位于同一行中的两个数组组合在一起,在连接之后位于同一虚拟行中。