我的理解:是的,从根本上说,HAVING在行上进行操作。通过省略GROUP BY,它可以对单个“超组”中的所有结果行进行操作,而不是对组内行进行操作。请阅读原始链接的Sybase docco中的“分组方式以及如何使用聚合进行查询” 一节:
其次,在“ having,groupby和where子句如何相互作用”部分中有一个简短的摘要:
当在查询中包含 , 和 子句时,每个子句影响行的顺序将确定最终结果:
@sqlGuru的解释就是对此的说明。
与此相关的是,我对使用Tsql“扩展列”的不符合ANSI的查询的行为感到惊讶。Sybase处理 (i) WHERE子句之后的扩展列 ( ii) 通过创建到原始表的额外联接,以及 (iii) 联接中未使用WHERE子句。这样的查询可能返回比预期更多的行,并且HAVING子句随后需要附加条件才能将其过滤掉。
请参阅原始链接的docco页面上的 “用于分组并具有的Transact-sql扩展” 下的示例 , 和 。我发现从Sybase安装 pubs2 示例数据库与示例一起使用非常有用。