我在学生和班级之间有多对多的关系,如下所示。我想获得所有没有注册任何课程的学生的身份证。
由于数据集的大小,我想避免使用NOT IN。有更有效的解决方案吗?
答案 0 :(得分:8)
NOT EXISTS应该给你最好的表现。有关详细信息,请参阅Left outer join vs NOT EXISTS。
SELECT s.StudentID
FROM student s
WHERE NOT EXISTS(SELECT NULL
FROM student_class sc
WHERE sc.StudentID = s.StudentID)
答案 1 :(得分:1)
select * from student
left join student_class on student_class.studentid = student.studentid
where student_class.scid is null;
答案 2 :(得分:1)
另一种方法是使用左连接:
SELECT s.student_id
FROM student s
LEFT JOIN student_class sc ON (sc.student_id = s.student_id)
WHERE sc.student_id IS NULL
答案 3 :(得分:1)
以下联接查询可能会得到答案
SELECT student.id
FROM student
LEFT JOIN student_class ON student.studentid = student_class.studentid
WHERE student_class.studentid IS NULL
答案 4 :(得分:1)
您也可以使用
SELECT StudentID
FROM student
EXCEPT
SELECT StudentID
FROM student_class