You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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子查询实现,同时修正你代码中的错误:

错误说明

  1. 函数拼写错误:SUBSRT应为SUBSTR,且Oracle中SUBSTR的起始索引是1(不是0),取首字母需用SUBSTR(first_name, 1, 1)
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:45:07