大查询“SELECT * EXCEPT”

Posted

技术标签:

【中文标题】大查询“SELECT * EXCEPT”【英文标题】:Big query "SELECT * EXCEPT" 【发布时间】:2021-08-16 20:07:45 【问题描述】:

我正在学习如何查询 bigquery(尤其是 STRUCT 和 ARRAY)

我有一个表结构如下参考表: 表名:地址 姓名(字符串)、年龄(INT、地址(记录和重复) Address 中的列是:address1、address2、city、zipcode

问题: 如何选择除邮政编码以外的所有列

我尝试如下查询

  SELECT 
  EXCEPT(zipcode)
  FROM Address, UNNEST(address) 

上述查询是两次检索地址记录字段列。

另外,后续运行的select命令如下

SELECT 
Name, 
Age, 
Address
from temp

地址应该包含除邮政编码以外的所有列。

【问题讨论】:

【参考方案1】:

如果你爆炸你的地址数组,你需要重建它。我不是 SQL 专家,但这段代码可以工作

select name, 
age, 
ARRAY_AGG(STRUCT(a.address1 as address1, a.address2 as address2, a.city as city)) as address 
from Address, unnest(address) a 
group by name, age

你不能使用* except,因为你需要按你的键分组来重建你的数组 agg

【讨论】:

【参考方案2】:

考虑下面 - 保留所有列,除了 address 被删除,其中 zipcode 被删除

select * except(address), 
  array(select as struct * except(zipcode) from t.address) address
from Addresses t

【讨论】:

以上是关于大查询“SELECT * EXCEPT”的主要内容,如果未能解决你的问题,请参考以下文章

从 Bigquery 中的查询复制表

BigQuery 重复数据删除和分区表

BigQuery row_number 删除重复项

BigQuery - 删除重复记录有时需要很长时间

是否可以在 SQL 中反转 select 语句?

从 Google BigQuery 中的选择中排除数组类型字段