繁体   English   中英

BigQuery 选择多个具有不同列名的表

[英]BigQuery select multiple tables with different column names

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

  • 表_0001:名称(字符串); 数字(字符串)
  • 表_0002:名称(字符串); 数字(字符串)
  • 表_0003:名称(字符串); 数字(字符串)
  • ...
  • 表_0865:名称(字符串); 代码(字符串)
  • 表_0866:名称(字符串); 代码(字符串)
  • ...

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

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。

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

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

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` 

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

SELECT

borrow.id AS `borrowId`,
IF(borrow.created_date IS NULL, '', borrow.created_date) AS `borrowCreatedDate`,
IF(borrow.return_date IS NULL, '', borrow.return_date) AS `borrowReturnDate`,
IF(borrow.return_date IS NULL, '0', '1') AS `borrowIsReturn`,

IF(person.card_identity IS NULL, '', person.card_identity) AS `personCardIdentity`,
IF(person.fullname IS NULL, '', person.fullname) AS `personFullname`,
IF(person.phone_number IS NULL, '', person.phone_number) AS `personPhoneNumber`,

IF(book.book_name IS NULL, '', book.book_name) AS `bookName`,
IF(book.year IS NULL, '', book.year) AS `bookYear`

FROM tbl_tbl_borrow AS borrow

LEFT JOIN tbl_person AS person
ON person.card_identity = borrow.person_card_identity

LEFT JOIN tbl_book AS book
ON book.unique_id = borrow.book_unique_id

ORDER BY
borrow.return_date ASC, person.fullname ASC;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM