2011-04-21 57 views
2

如果標題不明確,我很抱歉,但我無法弄清楚標題問題的好方法。通過參考表查找連接數

在我的數據庫中,我有一個連接表A和B的表J.也就是說,J有列a_id和b_id分別保存A和B中的條目的ID。 B還有一個「代碼」欄;爲了舉例,假設有三個條目的代碼爲'CC','DD'和'EE'。

現在,我想寫一個查詢,列出B中有多少個A有各種類型的代碼(有多少A有'CC',有多少有'DD',有多少有'EE')。

我寫的查詢,如下所示,並得到下面的輸出(製造數據,當然 - 按字母代碼順序排列):

SELECT b.CODE as code, COUNT(*) AS COUNT FROM a, b, j 
    WHERE j.a_id = a.id AND j.b_id = b.id 
    GROUP BY b.CODE ORDER BY b.CODE 

code | count 
============== 
CC | 5 
DD | 10 
EE | 2 

當我在一個新的記錄到B添加時發生該問題,用代碼'FF'說。現在在這一點上,我沒有J中的條目指向代碼'FF'。所以在輸出中,我想包含'FF',但是顯示計數爲0(沒有A被加入'FF')。

code | count 
============== 
CC | 5 
DD | 10 
EE | 2 
FF | 0 

不過,我目前的查詢,它並沒有做到這一點,其實遺漏了所有代碼,其中所得數爲0

可以在任何查詢大師在那裏幫助我改變我的查詢包括所有代碼的計數,無論它們是否爲0?這將不勝感激。

  • 伊恩

回答

1

您需要使用LEFT JOIN:

SELECT b.CODE as code, COUNT(a.id) AS a_count 
FROM b LEFT JOIN (j JOIN a ON j.a_id = a.id) ON j.b_id = b.id 
GROUP BY b.CODE ASC 
2

你需要使用LEFT JOIN這裏做到這一點。 LEFT JOIN將爲您提供來自表b的所有行,無論它們是否具有表j中的匹配行。

SELECT b.CODE as code, COUNT(a.id) AS COUNT 
    FROM b 
     LEFT JOIN j 
      INNER JOIN a 
       ON j.a_id = a.id 
      ON j.b_id = b.id 
    GROUP BY b.CODE 
    ORDER BY b.CODE 
+0

這將使該領域的空白FF。他們是否也需要添加:ISNULL(COUNT(*),0) – Genzume 2011-04-21 18:33:12

+0

不,它不會是空白的,它會是1,因爲*代表* 1行(在a_id中爲NULL )。您需要COUNT(a_id)來僅計算非NULL值。 – AndreKR 2011-04-21 18:40:55

+0

@AndreKR:我已經改正了。 – 2011-04-21 18:42:01