Oracle SQL语法错误求助:子查询用HAVING COUNT()求最高关注度FIELDNUM
解决Oracle SQL中用HAVING + ALL子查询找最大计数的问题
嘿,我来帮你捋捋这个SQL的问题!你报错的根源其实不是子查询不能用HAVING COUNT(),而是你的子查询逻辑和语法都有问题:
- 子查询语法错误:你写的子查询
SELECT FIELDNUM FROM INTEREST HAVING COUNT(ACNUM)里没有GROUP BY FIELDNUM,Oracle里HAVING必须配合GROUP BY使用(除非是对整个表聚合,但这里明显是要按领域分组统计),这直接导致了语法报错,也就是你看到的最后两个右括号处的错误提示。 - 逻辑不匹配:外层
HAVING COUNT(ACNUM) >= ALL(...)是拿当前分组的学者数量去和子查询的结果比较,但你子查询返回的是FIELDNUM(领域编号),这就变成了用数字(计数)和领域编号比较,类型不匹配,逻辑完全不对。
根据你的需求——找出有最多学者感兴趣的领域编号,且不能用MAX或ROWNUM,正确的SQL应该是这样的:
SELECT FIELDNUM FROM INTEREST GROUP BY FIELDNUM HAVING COUNT(ACNUM) >= ALL( -- 子查询先算出每个领域的学者数量,返回所有计数的集合 SELECT COUNT(ACNUM) FROM INTEREST GROUP BY FIELDNUM );
逻辑解释:
- 子查询部分:按
FIELDNUM分组,算出每个领域对应的学者数量,返回所有领域的计数结果。 - 外层查询:同样按
FIELDNUM分组统计学者数,然后判断这个计数是否大于等于所有其他领域的计数——满足这个条件的,自然就是学者数量最多的领域(如果有多个领域学者数相同且都是最大值,都会被查询出来,符合实际业务场景)。
这个写法完全符合你不能用MAX和ROWNUM的要求,而且语法和逻辑都没问题。
内容的提问来源于stack exchange,提问作者user8420047
相关产品推荐
相关产品推荐

