具有不同模式的联合表

时间:2014-02-03 06:58:50

标签: google-bigquery

我指的是约旦关于“处理不断发展的架构”的答案Dealing with evolving schemas

当我遇到类似的问题时,我试图查询具有不同模式的表并获得以下结果:

Select a,b,c 
FROM (Select 1 as a, 2 as b), --Test_a
     (Select 1 as a, 2 as b, 3 as c), --Test_b

运行得很好...... 我已将Test_a和Test_b放入物理表(所有字段都可为空)并尝试:

 Select a,b,c 
 FROM (Select a,b, from BI_WORKSPACE.Test_a), 
      (Select a,b,c from BI_WORKSPACE.Test_b)

它运行良好

但是当我尝试

 Select a,b,c 
FROM BI_WORKSPACE.Test_a,
     BI_WORKSPACE.Test_b 

失败了...... 有没有错误,我做错了什么? 最后一个样本是我追求的样本,因为它允许我随着时间的推移“进化”我的模式。每当我添加一列以支持新的业务需求时,我都希望避免更改所有现有表的模式。

非常感谢你的帮助。

询问的原因: 我们在“每日表”中保存我们的数据,因此在查询时我们只支付我们感兴趣的期间。 由于BQ不支持“动态SQL”,我们创建了一个脱机流程,该流程采用查询模板并生成所需期间的查询。就像是: 输入:

Select a,b,c FROM [<Source>] 

输出:

Select a,b,c FROM [MYDATASET.TABLE20140201], [MYDATASET.TABLE20140202], [MYDATASET.TABLE20140203], [MYDATASET.TABLE20140204] , [MYDATASET.TABLE20140205] , [MYDATASET.TABLE20140206] , [MYDATASET.TABLE20140207]

我们的流程不知道查询逻辑。有时我们会添加字段来支持不断变化的业务需求。 使用动态子选择会使工作人员复杂化,并且更改所有数百个现有表的模式是昂贵的并且容易出错。 有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我认为最后一个查询不应该。您要求两个表中的列a,b和c,但其中一个表没有具有该名称的列。这看起来像是一个查询错误,因为您明确要求表中不存在的列。

有一种解决方法 - 使用子选择 - 您注意到,如果您知道某个模式中可能缺少某个字段。当然,另一种解决方法是更新架构。

这似乎是按预期工作的。如果您不同意,可以告诉我原因吗?

答案 1 :(得分:1)

可以从具有不同模式的表的并集中进行选择。 简单的技巧是使用带有星号的子查询,就像Jordan提出的那样。没有必要改变架构。

在你的情况下,这将起作用

SELECT a,b,c 
FROM ( SELECT * FROM BI_WORKSPACE.Test_a ),
     ( SELECT * FROM BI_WORKSPACE.Test_b )