如何不使用JOIN实现子查询?Oracle学生库SQL问题求助
Oracle学生模式SQL问题解答
(a) 显示Section ID及各Section的选课人数
你的原SQL缺少section_id列的查询,正确语句需同时返回section ID和对应的选课人数:
SELECT section_id, COUNT(student_id) AS enroll_count FROM enrollment GROUP BY section_id;
注:COUNT(student_id)和COUNT(section_id)效果一致(假设section_id不为空),但用student_id更直观体现统计的是选课学生数。
(b) 列出就读于选课人数少于5的Section的学生(格式:姓氏, 名字首字母)
要求不使用JOIN,可通过嵌套子查询或EXISTS子查询实现,同时修正你代码中的错误:
错误说明
- 函数拼写错误:
SUBSRT应为SUBSTR,且Oracle中SUBSTR的起始索引是1(不是0),取首字母需用SUBSTR(first_name, 1, 1) ANY(5) < ...语法完全错误,ANY的正确用法是列名 运算符 ANY(子查询),此处逻辑不适用ANY,应改用IN或EXISTS判断学生所在的Section是否属于人数少于5的集合。
实现方式1:嵌套IN子查询
SELECT DISTINCT last_name || ', ' || SUBSTR(first_name, 1, 1) AS student_name FROM student WHERE student_id IN ( -- 找到所有在人数<5的Section中的学生ID SELECT student_id FROM enrollment WHERE section_id IN ( -- 先筛选出人数少于5的Section ID SELECT section_id FROM enrollment GROUP BY section_id HAVING COUNT(student_id) < 5 ) ) ORDER BY last_name;
实现方式2:EXISTS子查询(性能更优)
SELECT DISTINCT last_name || ', ' || SUBSTR(first_name, 1, 1) AS student_name FROM student s WHERE EXISTS ( -- 判断当前学生是否有选课记录 SELECT 1 FROM enrollment e1 WHERE e1.student_id = s.student_id AND EXISTS ( -- 判断该选课记录对应的Section人数是否<5 SELECT 1 FROM enrollment e2 WHERE e2.section_id = e1.section_id GROUP BY e2.section_id HAVING COUNT(e2.student_id) < 5 ) ) ORDER BY last_name;
注:DISTINCT用于去除重复的学生姓名,ORDER BY last_name按姓氏排序结果。
内容的提问来源于stack exchange,提问作者ProgrammingStudent
相关产品推荐
相关产品推荐

