BigQuery:合并/合并具有许多列且重叠的两个表

时间:2019-05-01 21:39:06

标签: google-bigquery

我有两个带有重叠列的大表,其中一些在重叠列中包含相同的值。这是一个玩具示例(在实际示例中,有数十列,重叠的列和不重叠的列):

Table 1: a, b, c

Table 2: a, d, e

a的某些值仅在一个表中,有些在两个表中。

有没有一个查询,可以让我生成一个包含所有可用值的表:

Table 3: a, b, c, d, e

我当前的查询要求列出每一列,这很冗长,包含数十列,并且在架构更改时不灵活:

SELECT
  coalesce(t1.a,
    t2.a) AS a,
  t1.b,
  t1.c,
  t2.d,
  t2.e
FROM
  t1
FULL JOIN
  t2
USING
  (a)

我尝试过的事情:UNION似乎需要相同的架构,SELECT t1.*, t2.*在重叠的列上引发错误,SELECT t1.* ... USING (a)将为a中的值提供空值,其中仅在t1.a中有值。

1 个答案:

答案 0 :(得分:2)

在我们所有人于2016年6月2日使用BigQuery Standard SQL之前-我对现在称为BigQuery Legacy SQL感到非常满意。对于某些特定的用例,我仍然会不时享受

我认为您在问题中描述的情况恰好是可以利用旧版SQL功能解决问题的一种情况

因此,以下是BigQuery旧版SQL

#legacySQL
SELECT * 
FROM [project:dataset.table1],
  [project:dataset.table2]

注意:在BigQuery旧版SQL逗号中-,-表示UNION ALL

上面的超级简化示例是

#legacySQL
SELECT * 
FROM (SELECT1 a, 2 b, 3 c, 11 x),
 (SELECT 1 a, 4 d, 5 e, 12 x)   

有结果

Row     a   b       c       x       d       e    
1       1   2       3       11      null    null     
2       1   null    null    12      4       5    

注意:您不能在同一查询中混合使用传统SQL和标准SQL,因此如果您需要对结果UNION使用标准SQL-您将需要首先将结果具体化(另存为表),然后使用标准SQL查询该表

  

使用标准SQL有什么办法

您可以使用INFORMATION_SCHEMA来编写两个表中的列以及所有涉及的列的构建列表的脚本-但是您需要sutill然后将结果复制粘贴到最终查询中才能运行