我正在尝试连接两个表,同时使用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
干杯
答案 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)
,您将获得预期的结果。您也可以使用coalesce
或isnull
,但如果您不真正需要该功能的结果,我也不会注意使用功能。
答案 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