0

我有两个表定义如下:

培训班

course ID     course Name
1             Math
2             Science
3             geography

和另一个表(它的用途是显示课程中的注册学生):

学生课程

course ID     student ID      Final cost
1             2               100
2             3               200

我需要一个 SQL 语句,它只选择某个学生(它的值是我页面上的控件中的一个参数——但这不是我的问题)没有注册的课程......

我最近的尝试是这样的:

SELECT 
   Courses.[Course ID], Courses.[Course name] 
FROM 
   Courses, student_courses 
where 
   Courses.[Course ID] <> student_courses.[Course ID]
4

3 回答 3

4

你只需要这样的东西:

SELECT
    c.[Course ID], c.[Course Name]
FROM
    dbo.Course c
WHERE
    NOT EXISTS (SELECT * FROM dbo.StudentCourses sc
                WHERE [Student ID] = 2 AND [Course ID] = c.[Course ID])

请参阅我的 SQL Fiddle 显示此内容

基本上,只需选择那些没有条目的Student_Courses课程[Student ID]

于 2012-12-09T09:34:21.673 回答
3
SELECT [Course ID], [Course name] 
FROM Courses
WHERE [Course ID] NOT IN 
 (SELECT Course ID from student_courses WHERE [student ID]=1) 
于 2012-12-09T09:36:22.923 回答
1

我能想到的最简单的(Transact)SQL 是这样的:

select 
     [courses].[course ID]
   , [courses].[course name]
from [courses]
left outer join [student_courses]  
       on   [student_courses].[course ID]  = [courses].[course ID] 
       and  [student_courses].[student ID] = @studentID
where 
     [student_courses].[student ID] is null

不要将“[student_courses].[student ID] = @studentID”放在 where 子句中,因为这会导致您感兴趣的空值被丢弃,并且您的左连接看起来像一个内连接。

如果你想变得不必要的复杂,你可以使用 group, having 和 count 来代替。

select 
    [courses].[course ID]
  , [courses].[course name]
from [courses]
left outer join [student_courses]  
           on   [student_courses].[course ID]  = [courses].[course ID] 
           and  [student_courses].[student ID] = @studentID
group by
     [courses].[course ID]
   , [courses].[course name]
having count([student_courses].[course ID]) = 0

丢失列名中的空格可能是个好主意。从长远来看,它只会给你带来麻烦。

于 2012-12-09T10:49:54.973 回答