SQL使用GROUP BY时如何校验多条件?相关报错问题求助
报错原因分析
- SQL的执行顺序优先级为:
FROM/JOIN->WHERE->GROUP BY-> 聚合计算 ->HAVING->ORDER BY,HAVING子句仅能使用分组字段或聚合函数计算结果作为判断条件 - 你的查询仅按
course字段分组,publisher既不属于分组字段,也没有被聚合函数包裹,因此在HAVING执行阶段无法识别该字段,哪怕字段真实存在、拼写正确也会抛出未知列错误 - 额外说明:你当前的SQL逻辑和业务需求并不匹配:需求是查询符合条件的图书,但当前查询返回的是课程编号,逻辑存在明显偏差。
解决方案
仅修复现有报错
如果仅需要解决当前的字段识别错误,只需把出版社过滤条件移到分组前执行的WHERE子句中即可:
SELECT course FROM text NATURAL JOIN book_adoption WHERE publisher = 'perason' GROUP BY course HAVING COUNT(book_isbn) > 1;
修正为匹配业务需求的SQL
如果要实现「查询既被课程采用、也被学生选用的图书」的需求,推荐使用显式关联替代不稳定的自然连接,按图书维度分组查询,写法如下:
SELECT t.book_isbn, t.booktitle, t.publisher, t.author FROM TEXT t INNER JOIN BOOK_ADOPTION ba ON t.book_isbn = ba.book_isbn WHERE t.publisher = 'perason' GROUP BY t.book_isbn, t.booktitle, t.publisher, t.author -- count>=1代表存在课程采用记录,count>1代表同时有其他选用记录(即学生选用) HAVING COUNT(ba.book_isbn) > 1;
内容的提问来源于stack exchange,提问作者Ashish Jain
相关产品推荐
相关产品推荐

