Oracle SQL统计获胜次数排除低最大值重复记录报错排查
问题原因与解决方案
报错根因
你的NOT IN运算符左侧仅为单个字段a.cnt_wins,但右侧子查询返回了b.cnt_wins和count(b.student_id)两个字段,两边字段数量不匹配,因此触发"too many values"报错。
修正后的SQL代码
WITH st_cte AS ( SELECT student_id, student_name, count(wins) cnt_wins FROM Table1 GROUP BY student_id, student_name ) SELECT * FROM st_cte a WHERE a.cnt_wins NOT IN ( -- 仅返回需要排除的获胜次数字段 SELECT b.cnt_wins FROM st_cte b WHERE b.cnt_wins < (SELECT max(c.cnt_wins) FROM st_cte c) GROUP BY b.cnt_wins HAVING count(b.student_id) >= 2 ) -- 按要求输出排序 ORDER BY cnt_wins DESC, student_id ASC;
逻辑说明
- 内层子查询仅返回符合排除规则的
cnt_wins值:低于全局最大获胜次数、且对应2名及以上学生的获胜次数 - 外层查询过滤掉属于这些排除次数的学生记录,完全匹配你的业务规则
- 去掉了CTE内部的冗余排序,最终排序统一放在查询最外层,执行效率更高
内容的提问来源于stack exchange,提问作者SilverSpringbb
相关产品推荐
相关产品推荐

