SQL Server对同一列设置多查询条件时HAVING子句报错如何解决
报错原因
你编写的SQL报错是因为HAVING子句中直接使用了未分组、未被聚合函数包裹的groups字段,不符合SQL分组查询的语法规则。
正确实现SQL
如果只需要查询符合条件的name列表:
SELECT name FROM tbl WHERE groups >= 35 GROUP BY name HAVING -- 存在groups=35的记录时,必须同时有>=36的记录 (MIN(groups) = 35 AND MAX(groups) >= 36) -- 所有groups都>=36的情况直接保留 OR MIN(groups) >= 36
如果需要保留符合条件的name对应的所有groups>=35的行:
SELECT t.* FROM tbl t INNER JOIN ( SELECT name FROM tbl WHERE groups >= 35 GROUP BY name HAVING (MIN(groups) = 35 AND MAX(groups) >= 36) OR MIN(groups) >= 36 ) valid_name ON t.name = valid_name.name WHERE t.groups >= 35
执行结果
上述语句执行后返回的结果如下:
| name | groups |
|---|---|
| a | 35 |
| a | 36 |
| c | 36 |
| d | 37 |
完全符合筛选规则,成功排除了仅存在groups=35记录的nameb。
内容的提问来源于stack exchange,提问作者Kapil
相关产品推荐
相关产品推荐

