sql找出选择了有先行课的课程,但是没有选修先行课的学生的sid、name、cid
时间: 2024-09-18 08:04:28 浏览: 107
要找出选择了有先行课的课程但自己没有选修先行课的学生信息,你需要使用SQL的子查询和NOT IN操作符。假设我们有两个表,一个是`courses`表,包含课程ID (`cid`) 和它的先行课程ID (`pre_cid`),另一个是`student_courses`表,包含学生ID (`sid`) 和他们选择的课程ID (`course_id`)。
首先,我们需要找出所有有先行课(即`pre_cid`不为NULL)的课程ID:
```sql
SELECT DISTINCT cid FROM courses WHERE pre_cid IS NOT NULL;
```
然后,从`student_courses`表中选择那些选择了上述有先行课的课程,但不是这些课程的先行课程的学生:
```sql
SELECT sc.sid, s.name, sc.cid
FROM student_courses sc
JOIN students s ON sc.sid = s.sid
WHERE sc.cid IN (
SELECT DISTINCT cid FROM courses WHERE pre_cid IS NOT NULL
)
AND NOT EXISTS (
SELECT 1
FROM student_courses sc2
JOIN courses c ON sc2.course_id = c.pre_cid
WHERE sc2.sid = sc.sid AND c.cid = sc.cid
);
```
这个查询将返回每个满足条件的学生的`sid`、`name`以及他们选择的`cid`。
阅读全文