2011-09-20 102 views
3

我有以下所示的学生和班级之间的多对多关系。我想获得所有未注册任何课程的学生的ID。如何获取未在多对多关系中表示的行?

many-to-many relationship

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

+0

在MySQL 5+'NOT IN'上进行了优化,所以它不应该很慢。 – Johan

+1

@Johan:他没有使用MySQL。 –

+0

@Jekke:你有没有试过用'NOT IN'或者你认为它会太慢? –

回答

8

不存在应该给你最好的表现。有关更多详细信息,请参阅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) 
+0

查询优化器将为此反连接创建相同的计划,以便为具有左连接的计划创建该连接。 –

+1

@Jeremy:阅读我引用的文章。 –

+0

我对那篇文章提出了怀疑的眉毛。我敢打赌,你可以将这些数字倒转。 –

1
select * from student 
left join student_class on student_class.studentid = student.studentid 
where student_class.scid is null; 
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 
1

的follwoing联接查询可能会导致答案

SELECT student.id 
FROM student 
LEFT JOIN student_class ON student.studentid = student_class.studentid 
WHERE student_class.studentid IS NULL 
1

你也使用

SELECT StudentID 
FROM student 
EXCEPT 
SELECT StudentID 
FROM student_class 
相关问题