在我的应用程序中,我有一组过滤器,可以在列出资源时应用,通过添加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相同。
我想要做的是获取“Resources”表中具有在“ResourceFields”中列出了多个“ContactName”,并且“type”等于某个值的行数。
我想到了这个(别笑——我知道足够的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;
但是,我期望返回的是“Resources”表中行数的总和(在我的测试集中为43),但实际上返回了所有“rf.Value”字段的计数值(即,43个单独的计数值)。
我错在哪里了?
SUM()
,但除此之外我很喜欢这个。 - Chris Cunningham43
,但实际上却得到了43行的值。 - Andriy MCOUNT(*)
表达式必须有别名,即使你实际上并不关心这个列的值。并非所有子查询都必须始终有别名,但特别是派生表必须有别名。 - Andriy M