2017-03-23 173 views
0

我想在使用count函數獲取右表中的數字時連接兩個表。我認爲這正是LEFT JOIN的意思,但在這種情況下,它根本不起作用。Count()和左連接問題

的問題簡化版本

表1:

ID Data 
1 Blah 
2 Blaha 
3 Blahah 

表2:

ID Some Data 
1 xxxx 
1 xxxx 
1 xxxx 
1 xxxx 
1 xxxx 
3 xxxx 
3 xxxx 
3 xxxx 
3 xxxx 
3 xxxx 

我使用的查詢是:

SELECT table1.ID, count(table2.ID) As Count 
FROM table1 LEFT OUTER JOIN table2 ON table1.ID = table2.ID 
GROUP BY table1.ID 

我想顯示:

ID Count 
1 5 
2 0 
3 5 

但所有我可以顯示爲:

ID Count 
1 5 
3 5 

乾杯

+3

您的查詢看起來不錯。當然你用'table1.id'分組? –

+1

你確定你使用了一個左鍵而不是內鍵嗎? –

+0

您的查詢爲我提供了正確的結果。你確定table1位於連接的左邊部分嗎? –

回答

1

這將工作:

SELECT table1.ID, count(coalesce(table2.ID,'Dummy')) As Count 
FROM table1 LEFT OUTER JOIN table2 ON table1.ID = table2.ID 
GROUP BY table1.ID 

目前如何處理髮生的查詢是count(table2.ID)只計數不空值,爲了統計空值,我已經使用了coalesce函數,所以如果值爲null,函數返回dralult值,即。 'Dummy'隨機文本。您也可以獲得nvl。爲了更好的表現,你可以去​​3210。

首先,你可以去count(*)

2

檢查counttable2.ID返回null,在這種情況下返回0

SELECT table1.ID, IFNULL(count(table2.ID), 0) As Count 
FROM table1 LEFT OUTER JOIN table2 ON table1.ID = table2.ID 
GROUP BY table1.ID 
+0

對不起,我忘了說,我已經嘗試過(isnull,0),它仍然不會返回 –

+0

因此,您的查詢看起來不錯 – lubilis

1

如果使用count(id),只會算ID所不是NULL。試舉例如下:

SELECT  COUNT(1) 
,   COUNT(x.id) 
FROM  (
       SELECT  1 id UNION ALL 
       SELECT  NULL 
      ) x 

結果在2, 1

所以,如果你使用COUNT(1)你會得到預期的結果。您也可以使用​​3210或isnull,但如果您不真的需要該函數的結果,則不會看到使用函數的重點。

0

你不需要加入。 以實現期望的結果的最簡單方法:

SELECT table1.ID, 
    (SELECT count(*) FROM table2 WHERE table1.ID = table2.ID) As Counter 
FROM table1 

在表1假定的id值是唯一的。

如果table1.ID不是唯一的,你可以只使用DISTINCT關鍵字:

SELECT DISTINCT table1.ID, 
    (SELECT count(*) FROM table2 WHERE table1.ID = table2.ID) As Counter 
FROM table1