ORA-00918列定义模糊报错:查询借书最多最少会员ID与姓名
ORA-00918报错原因及正确实现方案
报错原因
- 列名歧义:
member_id字段同时存在issue与member两张表中,原SQL的SELECT子句未明确指定该字段所属的表,Oracle无法识别字段数据源,直接触发ORA-00918错误。 - 聚合函数用法错误:Oracle不支持在SELECT子句中直接嵌套
MAX(COUNT())这类多层聚合函数的写法;同时原SQL未添加GROUP BY子句,非聚合字段member_id、member_name和聚合函数共同查询时,必须按非聚合字段分组。 - 逻辑不匹配需求:即使语法修正,原写法也仅能返回最大、最小的借书数值,无法关联返回对应数值所属的用户信息,不符合获取对应用户ID、姓名的需求。
正确实现SQL
如下为适配Oracle语法的实现语句,可同时返回借书数量最多、最少的所有用户(包含并列情况):
WITH member_borrow_cnt AS ( -- 统计每个用户的借书总量 SELECT m.member_id, m.member_name, COUNT(i.issue_id) AS borrow_count FROM member m LEFT JOIN issue i ON m.member_id = i.member_id GROUP BY m.member_id, m.member_name ), borrow_rank AS ( -- 对借书量做双向排名 SELECT member_id, member_name, borrow_count, DENSE_RANK() OVER(ORDER BY borrow_count DESC) AS rank_max, DENSE_RANK() OVER(ORDER BY borrow_count ASC) AS rank_min FROM member_borrow_cnt ) -- 取借书量最多、最少的用户 SELECT member_id, member_name, borrow_count FROM borrow_rank WHERE rank_max = 1 OR rank_min = 1;
如果仅需要统计有过借书记录的用户,将CTE中的LEFT JOIN替换为INNER JOIN即可。
内容的提问来源于stack exchange,提问作者ARIJIT DASGUPTA
相关产品推荐
相关产品推荐

