首页 > 解决方案 > BigQuery 选择具有不同列名的多个表

问题描述

考虑我的数据集 my_dataset 中的以下 BigQuery 表架构:

我现在想使用以下方法合并所有表:

select * from `my_dataset.*`

但是,这不会产生第二组表的 CODE 列。据我了解,将采用数据集中第一个表的模式。

所以结果是这样的:

| NAME  | NUMBER | 
__________________
| John  | 123456 |
| Mary  | 123478 |
| ...   | ...... |
| Abdul | null   |
| Ariel | null   | 

我试图利用INFORMATION_SCHEMA以便分别选择两组表,然后将它们合并:

with t_code as (
    select
       table_name, 
from my_dataset.INFORMATION_SCHEMA.COLUMNS
where column_name = 'CODE'
    ),

select t.NAME, t.CODE as NUMBER from `my_dataset.*` as t
where _TABLE_SUFFIX in (select * from t_code)

但是,脚本仍然会在 my_dataset 的第一个表中查找其架构并返回:Error Running Query: Name CODE not found inside t

所以现在我很茫然:我怎样才能联合我所有的表而不必一个一个地联合它们?IE。如何在第二组表中选择 CODE 作为 NUMBER。

注意:虽然问题似乎是在这里提出的,但接受的答案似乎并没有真正回应这个问题(就我而言)。

标签: google-bigqueryunionwildcard

解决方案


我看到你可以做的技巧是首先通过运行收集所有代码

create table `my_another_dataset.codes` as 
select * from `my_dataset.*` where not code is null   

然后对任何一个带有number列的表进行任何简单的虚假更新 - 这将使带有number列的模式成为默认值。所以现在你可以收集所有数字

create table `my_another_dataset.numbers` as 
select * from `my_dataset.*` where not number is null     

最后你可以做简单的联合

select * from `my_another_dataset.numbers` union all
select * from `my_another_dataset.codes` 

注意:另请参阅我在您问题下方的评论


推荐阅读