我认为应该非常简单。一直无法找到答案。
我有4个独立数据记录器的4个表。每个表都有一个时间索引列,然后是一系列具有该记录器数据通道的coulmns。
我需要查询所有4个表以返回与给定时间索引匹配的行。但是,一个(或多个/或所有表)可能在时间列中没有该索引。在这种情况下,我需要查询为该表中的每个数据列返回null。
因此,如果每个表有3个数据通道,查询将始终返回13列(时间,12个通道),其中12个中的每一个都可以是数据,或者为null。
表1
+------+-------+-------+-------+
| time | chan1 | chan2 | chan3 |
+------+-------+-------+-------+
| 1 | 10 | 20 | 30 |
| 2 | 11 | 21 | 31 |
| 3 | 12 | 22 | 32 |
+------+-------+-------+-------+
表2
+------+-------+-------+-------+
| time | chan1 | chan2 | chan3 |
+------+-------+-------+-------+
| 1 | 100 | 200 | 300 |
| 3 | 120 | 220 | 320 |
+------+-------+-------+-------+
表3
+------+-------+-------+-------+
| time | chan1 | chan2 | chan3 |
+------+-------+-------+-------+
| 1 | 1000 | 2000 | 3000 |
| 3 | 1200 | 2200 | 3200 |
| 4 | 1300 | 2300 | 3300 |
+------+-------+-------+-------+
表4
+------+-------+-------+-------+
| time | chan1 | chan2 | chan3 |
+------+-------+-------+-------+
| 1 | 10000 | 20000 | 30000 |
| 4 | 13000 | 23000 | 33000 |
+------+-------+-------+-------+
所以如果我选择时间= 1作为输入它应该返回:
1,10,20,30,100,200,300,1000,2000,3000,10000,20000,30000
时间2应该返回:
2,11,21,31,null,null,null,null,null,null,null,null,null,
时间3应该返回:
3,12,22,32,120,220,320,1200,2200,3200,null,null,null
时间5应该返回:
5,null,null,null,null,null,null,null,null,null,null,null,null,
由于
答案 0 :(得分:1)
如果存在日志记录数据,您可以使用LEFT JOIN
将记录器的所有列连接到一行。不知怎的,这样:
SELECT t.time,
l1.*,
l2.*,
l3.*,
l4.*
FROM (SELECT '2018-06-05T06:05:18Z' time) t
LEFT JOIN logs1 l1
ON l1.time = t.time
LEFT JOIN logs2 l2
ON l2.time = t.time
LEFT JOIN logs3 l3
ON l3.time = t.time
LEFT JOIN logs4 l4
ON l4.time = t.time;
答案 1 :(得分:0)
您可以使用left join
和union all
:
select *
from (select ? as timeindex) t left join
dl1
using (timeindex)
union all
select *
from (select ? as timeindex) t left join
dl2
using (timeindex)
union all
select *
from (select ? as timeindex) t left join
dl3
using (timeindex)
union all
select *
from (select ? as timeindex) t left join
dl4
using (timeindex);
这假设列在四个表中完全相同且顺序相同。
using
子句允许使用select *
。它将包括子查询中定义的时间索引,即使没有匹配也是如此。