我正在寻找像
这样的联接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
答案 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
希望你能在你的特定情况下采纳这个想法