2016-02-12 68 views
1

我有兩個表,hoursmessages如何連接兩個表並返回0如果值不存在?

hours表僅具有一個列hour和插入0〜23的值。

messages表還有hour列。

我試圖加入這些表。但我的查詢不起作用。

select hours.hour,ifnull(count(*),0) from hours left join messages on messages.hour = hours.hour group by hours.hour

樣本數據是這裏

消息表

id text   sender datetime      hour 
1  Hi, John  Amy  2015-12-10 13:37:25 +0000 13 
2  Yup   Mike  2015-12-10 15:49:11 +0000 15 
3  you there? Mike  2015-12-10 15:49:34 +0000 15 

表營業時間

hour 
0 
1 
2 
3 
4 
.. 
23 

我的查詢結果

hour ifnull(count(*),0) 
0  1 
1  1 
2  1 
3  1 
4  1 
... 
13  1 
14  1 
15  2 
... 
24  1 

我想

hour ifnull(count(*),0) 
0  0 
1  0 
2  0 
3  0 
... 
13  1 
14  0 
15  2 
... 
24  0 

我如何加入兩個表並得到結果像上面?

+0

你需要'RIGHT JOIN' –

+0

@ PM77-1的感謝!但sqlite不支持右連接:( – Mystika

回答

0

使用CASE的條件和充分加入我們可以做到這一點

DECLARE @Table1 TABLE 
    (id int, text varchar(8), sender varchar(4), datetime varchar(25), hour int) 
; 

INSERT INTO @Table1 
    (id, text, sender, datetime, hour) 
VALUES 
    (1, 'Hi, John', 'Amy', '2015-12-10 13:37:25 +0000', 13), 
    (2, 'Yup', 'Mike', '2015-12-10 15:49:11 +0000', 15) 
; 

DECLARE @Table2 TABLE 
    (hour int) 
; 

INSERT INTO @Table2 
    (hour) 
VALUES 
    (0), 
    (1), 
    (2), 
    (3), 
    (4), 
    (6), 
    (7), 
    (8), 
    (9), 
    (13), 
    (15), 
    (16), 
    (23) 
; 

    Select T.hour, 
CASE WHEN cnt <> 0 THEN 
ROW_NUMBER()OVER(PARTITION BY T.cnt 
    ORDER BY (SELECT NULL)) 
ELSE CNT END cnt from (
select TT.hour, 
CASE WHEN ISNULL(T.hour,0)<> 0 
THEN 1 ELSE ISNULL(T.hour,0) 
    END cnt 
     from @Table1 T 
    FULL JOIN @Table2 TT 
    ON TT.hour = T.hour 

)T 
ORDER BY T.hour 
+0

謝謝,但sqlite不支持右和全外連接:( – Mystika

+0

然後只是去轉換工具什麼全加入將用於Sql Lite中...... @Mytika – mohan111

+1

只需使用加入,完全加入只是加入,或者做在哪裏克勞斯@Mystika –

相關問題