如何使用通配符在Big Query的标准SQL中查询特定分区的多个表

时间:2017-01-24 20:08:48

标签: google-bigquery

我正在尝试使用通配符查询BigQuery中的多个表(我有来自_ [0-9]后缀的表)

特定表的查询有效:

snippet

但这不是:

SELECT 
count(*)
FROM `maw_qa.rt_content_secondly_0`
where _PARTITIONTIME = timestamp('2017-01-24');

错误: 查询失败 错误:无法识别的名称:[5:7] _PARTITIONTIME

我正在使用标准SQL。 Legacy SQL甚至不在查询中使用通配符*。

正确执行此操作的方法是什么?

2 个答案:

答案 0 :(得分:2)

看起来通配符和分区在查询中不能一起工作

请尝试以下操作。它在BigQuery Legacy SQL中,因为在这个版本中它不那么浓密了 假设您有4个表,如果有更多 - 您需要在这里登记所有表

SELECT COUNT(*)
FROM 
  [maw_qa.rt_content_secondly_0],
  [maw_qa.rt_content_secondly_1], 
  [maw_qa.rt_content_secondly_2], 
  [maw_qa.rt_content_secondly_3]
WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24')  

当然类似的可以用BigQuery Standard SQL编写,但需要用UNION ALL等进行更多的输入。

对于标准SQL,它可能如下所示

SELECT COUNT(*) FROM (
  SELECT * FROM `maw_qa.rt_content_secondly_0` WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24') UNION ALL
  SELECT * FROM `maw_qa.rt_content_secondly_1` WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24') UNION ALL 
  SELECT * FROM `maw_qa.rt_content_secondly_2` WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24') UNION ALL 
  SELECT * FROM `maw_qa.rt_content_secondly_3` WHERE _PARTITIONTIME = TIMESTAMP('2017-01-24')   
)

答案 1 :(得分:0)

当您查询partitioned table时,您不需要使用_*语法,该语法是为表通配符(在_TABLE_SUFFIX上过滤的地方)保留的。在你的情况下,你应该这样做:

SELECT 
count(*)
FROM `maw_qa.rt_content_secondly`
where _PARTITIONTIME = '2017-01-24';