0

次のように定義された2つのテーブルがあります。

コース

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 句に入れないでください。これにより、目的の null 値が破棄され、左結合が内部結合のように見えるためです。

不必要に複雑にしたい場合は、代わりに 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 に答える