桌面上的左外连接可能存在也可能不存在 - 我可以避免工作失败吗?

时间:2016-05-19 13:09:05

标签: google-bigquery

我正在寻找像

这样的联接
select 
  a.*,
  b.info 
from 
  [table_a] a
left outer join
  [table_b_20160510] b
on
  a.id=b.id

[table_b_yyyymmdd]是一个可能存在也可能不存在的日志表,我事先无法知道。

是否有办法制定此查询,以便在特定日期的单个日志表不存在时不会失败?

我知道我可以做一个表格日期范围功能,但它甚至可能最终导致合理的天数可能会丢失日志(主要是在我们开始捕捉它们之前的历史记录)。

我的解决方案是创建一个包含所有内容和日期日期的大table_b,然后再选择感兴趣的日期范围,这样如果返回0行则没问题。只是我的所有日​​志的大table_b不久会变得疯狂,所以这种方法似乎效率低下。

我也在这里试过table_query(),看看是否会优雅地失败,但它会抛出一个错误(当然这是有道理的)。

select 
  * 
from 
  (select 'test' as id) a
left outer join 
  (select * from TABLE_QUERY(misc,'table_id CONTAINS "FOO_THIS_TABLE_DOES_NOT_EXIST"')) b
on 
  a.id=b.id

1 个答案:

答案 0 :(得分:1)

这就是我能做的 以下是您的table_b_20160510

SELECT * FROM temp.table_b_20160510

Row id  info     
1   1   abc  
2   2   xyz  

我会创建具有完全相同的架构和零行的空表 - table_b_empty

SELECT * FROM temp.table_b_empty

Row id  info     
Query returned zero records.

所以,现在考虑以下查询:

SELECT a.*, b.info 
FROM 
  (SELECT * FROM (SELECT 1 AS id), (SELECT 2 AS id), (SELECT 3 AS id)) a
LEFT JOIN 
  (SELECT * FROM TABLE_QUERY
    (temp, 'table_id = "table_b_20160510" OR table_id = "table_b_empty"')
  ) b
ON a.id=b.id

表 - table_b_20160510 - 存在,结果是:

Row a_id    b_info   
1   1       abc  
2   2       xyz  
3   3       null     

现在,尝试使用table_b_20160511(假设它不存在)

SELECT a.*, b.info 
FROM 
  (SELECT * FROM (SELECT 1 AS id), (SELECT 2 AS id), (SELECT 3 AS id)) a
LEFT JOIN 
  (SELECT * FROM TABLE_QUERY
    (temp, 'table_id = "table_b_20160511" OR table_id = "table_b_empty"')
  ) b
ON a.id=b.id

没有失败,结果是:

Row a_id    b_info   
1   1   null     
2   2   null     
3   3   null     

希望你能在你的特定情况下采纳这个想法