2015-05-18 84 views
0

我有兩個表: 表a包含每個c_id每分鐘的值。 (如果c_id缺少數據,分鐘 - 缺少行)。SQL連接添加缺少數據的時間和標識符

表一:包含所有分鐘

--------------------------------- 
| c_id | TIME_SEC | C_VALUE | 
--------------------------------- 
| 1 | 1431943200 |  10 | 
--------------------------------- 
| 1 | 1431943260 |  11 | 
--------------------------------- 
| 2 | 1431943200 |  12 | 
--------------------------------- 

表時間:

------------ 
| TIME_SEC | 
------------ 
|1431943140| 
------------ 
|1431943200| 
------------ 
|1431943260| 
------------ 
|1431943320| 
------------ 

我想在一個包括失蹤數據的所有數據倍之間給出c_ids。例如,對於:在1431943140之間 C_ID(1,2)和TIME_SEC和1431943320

預期的結果是:

--------------------------------- 
| c_id | TIME_SEC | C_VALUE | 
--------------------------------- 
| 1 | 1431943140 | null | 
--------------------------------- 
| 1 | 1431943200 |  10 | 
--------------------------------- 
| 1 | 1431943260 |  11 | 
--------------------------------- 
| 1 | 1431943320 | null | 
--------------------------------- 
| 2 | 1431943140 | null | 
--------------------------------- 
| 2 | 1431943200 |  12 | 
--------------------------------- 
| 2 | 1431943260 | null | 
--------------------------------- 
| 2 | 1431943320 | null | 
--------------------------------- 

將缺少的數據表中的是不是一種選擇,因爲它增加了巨大量數據。

我試圖用這個SQL:

select * 
from 
(
select * from 
a where c_id IN (1,2) AND TIME_SEC between 1431943140 and 1431943320 
) m 
right join times t 
on (m.TIME_SEC = t.TIME_SEC); 

但它返回缺少全球每分鐘的數據 - 所有的c_id:

--------------------------------- 
| c_id | TIME_SEC | C_VALUE | 
--------------------------------- 
| null | 1431943140 | null | 
--------------------------------- 
| 1 | 1431943200 |  10 | 
--------------------------------- 
| 1 | 1431943260 |  11 | 
--------------------------------- 
| 2 | 1431943200 |  12 | 
--------------------------------- 
| null | 1431943320 | null | 
--------------------------------- 

任何幫助嗎?

回答

1

創建期望的C_ID和時代的派生表,然後離開它JOIN到的值:

select m.c_id, m.TIME_SEC, a.C_VALUE 
from (
    SELECT DISTINCT a.c_id, t.TIME_SEC 
    FROM a 
    CROSS JOIN times t 
    where a.c_id IN (1,2) AND t.TIME_SEC between 1431943140 and 1431943320 
) m 
LEFT OUTER JOIN a 
    ON m.c_id=a.c_id 
    AND m.TIME_SEC=a.TIME_SEC; 
+0

你的'where'子句將'left join'變成'inner join'。 – fancyPants

+0

你是對的。我認爲,編輯和修復。 –

+0

它不會給出空值。 – BobTheBuilder

0

首先使用cross join的所有行。隨後帶來的附加價值:

select c.c_id, t.time_sec, a.c_value 
from (select 1 as c_id union all select 2) c cross join 
    (select distinct time_sec 
     from a 
     where c_id in (1, 2) and time_sec between 1431943140 and 1431943320 
    ) t left join 
    a 
    on a.c_id = c.c_id and a.time_sec = t.time_sec; 

編輯:

如果你想使用times表:

select c.c_id, t.time_sec, a.c_value 
from (select 1 as c_id union all select 2) c cross join 
    times t left join 
    a 
    on a.c_id = c.c_id and a.time_sec = t.time_sec; 

我不知道是否需要或不where條款限制時間。