如何获得多对多关系中没有表示的行?

时间:2011-09-20 16:19:37

标签: sql sql-server tsql

我在学生和班级之间有多对多的关系,如下所示。我想获得所有没有注册任何课程的学生的身份证。

many-to-many relationship

由于数据集的大小,我想避免使用NOT IN。有更有效的解决方案吗?

5 个答案:

答案 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