在我的应用程序中,我有一组可以在列出资源时应用的过滤器,这些过滤器通过在执行查询之前添加 WHERE 子句等来构建查询。这是使用 SQL Server 2008。
我有两个相关的表,一个包含有关资源的一些静态数据,另一个可以包含与该资源相关的任意/可选字段。
第一个表是这样的(表名和字段已更改):
CREATE TABLE Resources (
ResID varbinary(28),
... extra stuff omitted
type integer );
第二个表只有名称/值对和相应的资源 ID
CREATE TABLE ResourceFields (
ResID varbinary(28) NOT NULL,
Name nvarchar(255) NOT NULL,
Value nvarchar(1024) NOT NULL);
因此,对于此示例,“ResourceFields”中可能存在多个行,其名称 =“ContactName”,且具有相同的 ResID。
我想要做的是获取“资源”表中的行数,这些行数在“资源字段”中列出了多个“联系人姓名”,且“类型”等于某个值。
我想出了这个(别笑——我知道的 SQL 足以引起问题)
SELECT count(r.ResID)
FROM Resources as r
INNER JOIN ResourceFields AS rf
ON rf.ResID = r.ResID
AND rf.name = 'ContactName'
WHERE r.type = 1
GROUP BY rf.ResID
HAVING COUNT(rf.Value) > 1;
但我没有返回“资源”中的行数(我的测试集中为 43),而是得到了所有返回的 COUNT(rf.Value) 值(即 43 个单独的计数)。
我究竟做错了什么?