在 Querying MS SQL Server 2012 (Training Kit) for Exam 70-461 一书中,它谈到GROUP BY
了逻辑处理中的查询阶段:
此查询的最终结果有一行代表每个组 (除非被过滤掉)。因此,在当前分组阶段之后发生的所有阶段中的表达式都有一定的限制。在后续阶段处理的所有表达式必须保证每个组有一个值。如果您从 GROUP BY 列表中引用一个元素(例如,国家/地区),您已经有了这样的保证,因此允许这样的引用。但是,如果要引用不属于 GROUP BY 列表的元素(例如 empid),则它必须包含在 MAX 或 SUM 等聚合函数中。这是因为单个组内的元素中可能有多个值,并且保证只返回一个值的唯一方法是聚合这些值。
然后作者提到了HAVING
他使用的步骤COUNT(*) > 1
。我的问题是,如果GROUP BY
唯一的结果是每组 1 行,那么HAVING
使用该单组行的阶段如何过滤掉任何超过 1 行的组......它会保留其中的一半?所以我在这里错过了什么。每个组是否有某种隐藏的 COUNT 列?
查询是:
SELECT country, YEAR(hiredate) AS yearhired, COUNT(*) AS numemployees
FROM HR.Employees
WHERE hiredate >= '20030101'
GROUP BY country, YEAR(hiredate)
HAVING COUNT(*) > 1
ORDER BY country , yearhired DESC;
请解惑。