我正在使用MS SQL 2008,我有一个状态表(id,name)和一个项目表(id,name,statusid,deleted)。
我想计算每种状态的项目数,并具有以下查询:
SELECT status.id,
ISNULL(COUNT (items.name), 0) AS 'count'
FROM status
LEFT OUTER JOIN items
ON items.statusid = status.id
GROUP BY status.id
复杂的是,我希望获得所有状态,如果没有状态项,则为0。
以上工作正常,但是当我添加WHERE items.deleted = 0
时,它不再显示其中包含0的行。
为什么WHERE
子句会查询我的查询?我怀疑我的方法可能有误......
谢谢:)
答案 0 :(得分:5)
SELECT status.id,
COUNT (items.statusid) AS 'count'
FROM status
LEFT OUTER JOIN
items
ON items.statusid = status.id
AND items.deleted = 0
GROUP BY
status.id
为什么
WHERE
子句会查询我的查询?我怀疑我的方法可能有误......
因为如果没有给定statusid
的项目,LEFT JOIN
会返回一行,所有项目字段都设置为NULL
。
您的WHERE
子句会过滤掉这些行(NULL = 0
返回NULL
)并且他们不会进入GROUP BY
。
另请注意,ISNULL
上的COUNT
无效:COUNT
永远不会返回NULL
个值。它只是不计算NULL
s,所以将JOIN
子句的一部分列放入COUNT
就可以了。
答案 1 :(得分:0)
问题是可能没有要引用的items
行,因为它跨越外连接;您可以尝试使用ISNULL重新编写WHERE子句:
WHERE ISNULL(items.deleted, 0) = 0