我指的是约旦关于“处理不断发展的架构”的答案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]
我们的流程不知道查询逻辑。有时我们会添加字段来支持不断变化的业务需求。 使用动态子选择会使工作人员复杂化,并且更改所有数百个现有表的模式是昂贵的并且容易出错。 有什么建议吗?
答案 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 )