【问题标题】:BigQuery select multiple tables with different column namesBigQuery 选择具有不同列名的多个表
【发布时间】:2021-07-30 03:45:40
【问题描述】:

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

  • Table_0001:名称(字符串); NUMBER(字符串)
  • Table_0002:名称(字符串); NUMBER(字符串)
  • Table_0003:名称(字符串); NUMBER(字符串)
  • ...
  • Table_0865:名称(字符串);代码(字符串)
  • Table_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

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

注意:虽然看起来 the question was asked over here,但接受的答案似乎并没有真正回答问题(就我而言)。

【问题讨论】:

  • 所以你有两个不同的模式 - 你知道哪个范围属于哪个模式吗?例如:Table_0001 到 Table_0864 有一个架构,而 Table_0865 及以上有另一个架构?还是未知?
  • 实际范围没有像我的示例中那样清楚地注明。表的名称实际上在集合中有所不同。我简化了这个 OP 的例子。
  • 唯一的方法是动态地构建所有表的联合并使用 EXECUTE IMMEDIATE 执行它。应该很简单 - 但如果你看到这会让你满意并且你仍然需要帮助 - 请告诉我
  • 如果我使用立即执行,它不能保存为视图对吗?我必须运行一个查询并将结果存储在一个表中以供进一步使用?
  • 正确。您将无法将其保存为视图。但您可以将其保存为表格

标签: google-bigquery union wildcard


【解决方案1】:

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

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 * from 'my_dataset.*' where not CODE is null 不起作用。它会抛出一个错误,指出 CODE 不是一个可识别的名称。
  • 反方向做!从数字开始,然后是代码!
【解决方案2】:
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;

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多