SQL子查询列过多错误排查:筛选候选人数≥50的学校并获取候选人姓名
问题解决:SQL子查询列数过多错误
错误原因
你写的IN子查询返回了candidate_id、school_name、count(e.school_name)三列,但IN操作符要求子查询只能返回单列,这直接导致了报错。另外你的分组逻辑也不符合需求——按candidate_id和school_name分组,统计的是单个候选人在同一学校的就读次数,而非学校的总候选人数。
正确SQL写法
我们需要先筛选出有50名及以上候选人就读的学校,再关联获取对应候选人的姓名,以下是两种可行方案:
方案1:使用JOIN(推荐,性能更优)
SELECT c.first_name, c.last_name FROM candidates c JOIN educations e ON c.id = e.candidate_id JOIN ( -- 先统计出符合人数要求的学校 SELECT school_name FROM educations GROUP BY school_name -- 用DISTINCT确保同一候选人多次就读同一学校时只算一次 HAVING COUNT(DISTINCT candidate_id) >= 50 ) AS popular_schools ON e.school_name = popular_schools.school_name;
方案2:使用嵌套IN子查询
SELECT first_name, last_name FROM candidates WHERE id IN ( SELECT candidate_id FROM educations WHERE school_name IN ( -- 先筛选出符合人数要求的学校 SELECT school_name FROM educations GROUP BY school_name HAVING COUNT(DISTINCT candidate_id) >= 50 ) );
补充说明
- 如果你的业务场景中,每个候选人在同一学校只会有一条记录,也可以把
COUNT(DISTINCT candidate_id)替换为COUNT(*),但保留DISTINCT能避免数据异常导致的统计错误,更严谨。
内容的提问来源于stack exchange,提问作者nick lanta
相关产品推荐
相关产品推荐

