2015-07-13 356 views
6

我想返回一个在一个部门上课但不在另一个部门上的学生列表。这是我的查询,由于某种原因,其结果是空白。如何查询一个不包含MySQL中另一个集合中的任何成员的集合?

SELECT * 
FROM student 
JOIN transcript 
    ON student.id = transcript.studID 
JOIN course 
    ON transcript.crsCode = course.crsCode 
WHERE deptId = "CSCI" NOT IN 
     (
     SELECT student.name 
     FROM student 
     JOIN transcript 
      ON student.id = transcript.studID 
     JOIN course 
      ON transcript.crsCode = course.crsCode 
     WHERE deptId = "MATH" 
); 

这里是什么表是这样的:

Student (id, name, address, status) 
Transcript (studId, crsCode, semester, grade) 
Courses (crsCode, deptId, crsName, descr) 
+0

例如http://forums.mysql.com/read.php?10507748,507839 – Strawberry

回答

2

要检查两个条件,你需要添加AND子句中查询并检查student.name是在你的子查询作为NOT IN

SELECT * 
FROM student 
JOIN transcript 
    ON student.id = transcript.studID 
JOIN course 
    ON transcript.crsCode = course.crsCode 
WHERE deptId = "CSCI" AND student.name NOT IN 
     (
     SELECT student.name 
     FROM student 
     JOIN transcript 
      ON student.id = transcript.studID 
     JOIN course 
      ON transcript.crsCode = course.crsCode 
     WHERE deptId = "MATH" 
); 
3

您可以使用两个exists条件 - 一个用于要包含的部门和一个用于要排除的部门德。

SELECT s.* 
FROM student s 
WHERE EXISTS (SELECT * 
       FROM transcript t 
       JOIN courses c ON t.crsCode = c.crsCode 
       WHERE deptId = 'MATH' AND t.studId = s.id) AND 
     NOT EXISTS (SELECT * 
       FROM transcript t 
       JOIN courses c ON t.crsCode = c.crsCode 
       WHERE deptId = 'CSCI' AND t.studId = s.id) 
4

不使用子查询: -

SELECT DISTINCT student.* 
FROM student 
JOIN transcript 
ON student.id = transcript.studID 
INNER JOIN course c1 
ON transcript.crsCode = c1.crsCode 
AND c1.deptId = 'CSCI' 
LEFT OUTER JOIN course c2 
ON transcript.crsCode = c2.crsCode 
AND c2.deptId = 'MATH' 
WHERE c2.crsCode IS NULL 

这是加盟学生成绩单。然后它加入课程两次,一次为你想要的课程,一次为你不想要的课程的左外连接。 WHERE子句检查你不想要的课程是否匹配。

DISTINCT用于将结果限制为单次出现次数。这可能没有必要,但这取决于一个学生是否可以多次完成课程。

+0

当然,这只是选择学生。 – Strawberry

+0

非常真实@Strawberry,但这是OP在问题中表示他们想要的。 – Kickstart

相关问题