2011-04-21 91 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