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