SQL - 多个表 - 始终返回数据或null

时间:2018-06-05 12:22:16

标签: mysql sql

我认为应该非常简单。一直无法找到答案。

我有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,

由于

2 个答案:

答案 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 joinunion 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 *。它将包括子查询中定义的时间索引,即使没有匹配也是如此。