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

SQL查询逻辑问题:获取学过AutoCAD未学Revit的学生列表失败

解决你的SQL逻辑错误问题

你的查询问题出在NOT EXISTS子查询没有和外层的学生记录关联——这就导致子查询在检查的是「整个数据库里有没有人学过Revit」,而不是「当前这条学生记录对应的人有没有学过Revit」。只要数据库里存在任何一条Revit课程的记录,NOT EXISTS就会返回false,整个WHERE条件直接不成立,自然查不到结果。

正确的写法一:关联学生的NOT EXISTS查询

我们需要在子查询里加上学生的唯一标识(比如StudentID),让它只针对当前学生做检查:

SELECT DISTINCT s.* 
FROM StudentData s
WHERE s.CourseName LIKE 'AutoCAD%'
AND NOT EXISTS (
    SELECT 1  -- 用1代替*更高效,数据库无需返回整行数据
    FROM StudentData s2
    WHERE s2.StudentID = s.StudentID  -- 关键:绑定同一个学生的记录
    AND s2.CourseName LIKE 'Revit%'
);

加DISTINCT是因为一个学生可能学过多门AutoCAD相关课程,会出现重复的学生记录,去重后能得到唯一的学生列表。

正确的写法二:用GROUP BY + HAVING统计课程情况

如果你不想用子查询,也可以通过分组统计每个学生的课程覆盖情况来实现:

SELECT s.StudentID, s.StudentName -- 建议只选学生的唯一标识和基础信息,不要选CourseName
FROM StudentData s
GROUP BY s.StudentID, s.StudentName
HAVING 
  SUM(CASE WHEN s.CourseName LIKE 'AutoCAD%' THEN 1 ELSE 0 END) > 0  -- 至少学过一门AutoCAD
  AND SUM(CASE WHEN s.CourseName LIKE 'Revit%' THEN 1 ELSE 0 END) = 0;  -- 一门Revit都没学

这种方式通过分组后统计符合条件的课程数量,能更直观地筛选出你需要的学生。

补充说明

你之前用EXISTS能得到同时学过两门课的学生,应该是当时的查询无意中关联了学生(或者数据巧合),但这次加NOT的时候忘记绑定关联条件才导致出错。核心逻辑就是:子查询必须和外层的学生记录绑定,才能针对每个学生做单独的课程检查。

内容的提问来源于stack exchange,提问作者Renier Swart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:11:20