嗨,我有3个表ModulesStudents和连接表(多对多)StudentModules。我想选择学生没有注册的所有模块。当学生注册时,信息存储在StudentModules表中。基本上,我想从StudentModules表中选择所有与Modules表中的学生号无关的模块。
我试过下面的代码

SELECT Modules.*, Students.*
FROM            ((StudentsModules INNER JOIN
                     Modules ON StudentsModules.ModuleCode = Modules.ModuleCode) INNER JOIN
                     Students ON StudentsModules.StudentNo = Students.StudentNo)
                     Where StudentNo = 48377767 AND WHERE ModuleCode NOT IN (SELECT ModuleCode FROM StudentsModules)

最佳答案

在本例中,假设学生编号48377767,一种选择学生未注册的所有模块的可能方法:

SELECT m.*
FROM Modules m
     LEFT JOIN StudentsModules sm ON sm.ModuleCode = m.ModuleCode
                                     AND sm.StudentNo = 48377767
WHERE sm.ModuleCode IS NULL

[SQL Fiddle]
更新:
不带JOIN的不同方法:
SELECT m.*
FROM Modules m
WHERE m.ModuleCode NOT IN
                   (
                      SELECT ModuleCode
                      FROM StudentsModules
                      WHERE StudentNo = 48377767
                    )

10-08 09:04