Count()和左连接问题

时间:2017-03-23 09:21:43

标签: sql sql-server count left-join

我正在尝试连接两个表,同时使用count函数来获取右表中的数字。我认为这正是LEFT JOIN的用途,但在这种情况下它根本不起作用。

问题的简化版

表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

干杯

4 个答案:

答案 0 :(得分:2)

检查count的{​​{1}}是否返回null,在这种情况下返回0

table2.ID

答案 1 :(得分: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。为了获得更好的性能,您可以选择coalesce

最重要的是你可以选择 count(*)

答案 2 :(得分:1)

如果您使用count(id),它将只计算非NULL的ID。请尝试以下示例:

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

2, 1中的结果。

因此,如果您使用COUNT(1),您将获得预期的结果。您也可以使用coalesceisnull,但如果您不真正需要该功能的结果,我也不会注意使用功能。

答案 3 :(得分:0)

您不需要加入。 达到预期结果的最简单方法:

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

假设table1中的id值是唯一的。

如果table1.ID不是唯一的,您只需使用DISTINCT关键字:

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