2016-07-22 80 views
0

假设我有三个表Student,Class,Student_Class(链接表)。查询sql查找所有未注册的特定类的学生

Table:Student 
Student_ID 
FirstName 
LastName 

Table:Class 
Class_ID 
Class_name 

Table:Student_Class (Linking Table) 
StudentClass_ID 
Class_ID 
Student_ID 

给定一个特定的Class_ID,我想知道所有未注册该特定班级的学生。

我试过以下,但它不起作用。可以说,我尝试类ID = 3

SELECT DISTINCT Student.* 
FROM Student 
INNER JOIN Student_Class 
    ON Student.Student_ID = Student_Class.Student_ID 
WHERE ((NOT (Student_Class.Class_ID)= 3)) 
+0

您是否使用'MySQL'或'MS Access'?它们不是同一件事。 – Siyual

+0

我正在使用MS-Accesss –

回答

0

流量

  1. 匹配所有学生,所有类
Student INNER JOIN Student_Class ON (Student.Student_ID = Student_Class.Student_ID)
  • 拒绝学生特殊类别(例3)
  • (Student_Class.Class_ID <> 3)

    查询:

    SELECT Student.* 
        FROM Student INNER JOIN Student_Class 
        ON (Student.Student_ID = Student_Class.Student_ID) 
    WHERE (Student_Class.Class_ID <> 3); 
    

    为了让他们没有在任何课程的所有学生,请尝试以下:

    SELECT Student.* 
        FROM 
         (
         SELECT Student.* 
          , Student_Class.Class_ID 
          FROM Student LEFT JOIN Student_Class ON Student.Student_ID = Student_Class.Student_ID 
         WHERE ((Student_Class.Class_ID <> 3) OR (Student_Class.Class_ID IS NULL)) 
         ) Student LEFT JOIN Class ON Student.Class_ID = Class.Class_ID 
    ;

    数据:

    enter image description here

    结果:

    enter image description here

    +0

    如果学生根本没有注册*任何*类,该怎么办?这不会捕获任何不在'Student_Class'表中的学生。 – Siyual

    +0

    @Siyual 我不知道可以在MS Access中使用左连接。 但它是类似的我认为:

     SELECT Student.* FROM Student LEFT JOIN Student_Class ON (Student.Student_ID = Student_Class.Student_ID) Student_Class INNER JOIN Class ON (Student_Class.Class_ID = Class.Class_ID) WHERE (Student_Class.Class_ID <> 3) ; 

    +0

    试过这个。不工作。向我展示正在参加班级3的学生,这是我不想要的。这可能是因为这些同样的学生可能会参加一个班级4,并且班级4与这些学生在链接表中关联。因此它显示了它们。 –

    0

    下面的查询将显示没有参加一个或多个班级的所有学生,包括班级名称。

    SELECT Student.Student_ID, Student.FirstName, Student.LastName, 
    Class.Class_ID, Class.Class_name 
    FROM Class, Student 
    WHERE NOT EXISTS 
    (
    SELECT * 
    FROM Student_Class 
    WHERE Student_Class.Student_ID = Student.Student_ID AND 
    Student_Class.Class_ID = Class.Class_ID