2013-03-01 25 views
0

我正在嘗試找到剩餘的可用於註冊課程的學生。要做到這一點,我需要找到當前活躍並且當前不在課程中的學生。 Bu我認爲我正在寫的查詢是不正確的,因爲當我運行查詢時,它會一直顯示一組空的結果,我怎麼才能找到能夠註冊課程的剩餘學生?如何編寫正確的查詢以找到當前不在課程中的學生

下面是當前查詢:

SELECT st.StudentId, StudentAlias, StudentForename, StudentSurname 
FROM Course c 
     INNER JOIN Student_Course sc 
      ON c.CourseId = sc.CourseId 
     INNER JOIN Student st 
      ON sc.StudentId = st.StudentId 
WHERE (c.CourseId = 1 AND 
     sc.StudentId IS NULL 
     AND st.Active = 1) 
ORDER BY st.StudentAlias 

下面是表:

學生:(所有學生的列表)

StudentId StudentAlias StudentForename StudentSurname Active 
1   u09382  James   Smith   1 
2   u83923  John    Brooks   1 
3   u38292  Karen   Bradshaw  0 
4   u20039  Chris   Cameron   1 
5   u39399  Jane    Fields   1 

課程:(全部名單課程)

CourseId CourseNo CourseName 
1   INFO121 ICT 
2   BUS122 Business and Finance 
3   ENG432 English Language 

Student_Course:(學生名單報名參加相應課程)

StudentId CourseId 
1   1 
1   3 
2   1 
4   2 
5   2 

因此,舉例來說,如果我選擇CourseId = 1,那麼它應該顯示學生誰是積極的,但還沒有明顯不CourseId = 1這意味着它它應該顯示這些學生低於招生的可能性爲課程:

4 - Chris Cameron 
5 - Jane Fields 

回答

2

試試這個查詢

SELECT s.studentId, s.Forename 
FROM Student s 
WHERE s.studentId NOT IN (SELECT studentId 
FROM Student_Course c WHERE c.courseId = 1) AND s.Active = 1 

courseId = 1的內部子查詢返回學生,在外部查詢中我們過濾這些學生。

+0

您的查詢似乎正常工作。最佳答案。謝謝 – user2048994 2013-03-01 11:12:14

+0

歡迎.....:) – Meherzad 2013-03-01 11:13:49

+0

嘗試左連接解決方​​案,而不是子選擇。子選擇通常較慢 – Kickstart 2013-03-01 11:25:26

1

試試這個

SELECT st.StudentId, StudentAlias, StudentForename, StudentSurname 
FROM Course c 
     INNER JOIN Student_Course sc 
      ON c.CourseId = sc.CourseId 
     INNER JOIN Student st 
      ON sc.StudentId = st.StudentId 
WHERE (sc.CourseId <> 1 
     AND st.Active = 1) 
ORDER BY st.StudentAlias 
+0

'<> 1'是什麼意思?從來沒有見過之前 – user2048994 2013-03-01 11:03:55

+0

這意味着不等於在sql http://www.w3schools.com/sql/sql_where.asp – Meherzad 2013-03-01 11:05:14

+0

<>意味着不等於。 (sc.CourseId!= 1) – Sachin 2013-03-01 11:06:30

0

要找到活動的學生沒有一門課程,然後是這樣的: -

SELECT st.StudentId, StudentAlias, StudentForename, StudentSurname 
FROM Student st 
LEFT OUTER JOIN Student_Course sc ON sc.StudentId = st.StudentId 
LEFT OUTER JOIN Course c ON c.CourseId = sc.CourseId 
WHERE c.CourseId IS NULL 
AND st.Active = 1 
ORDER BY st.StudentAlias 

如果您要檢查學生不是在一個特定的課程,然後

SELECT st.StudentId, StudentAlias, StudentForename, StudentSurname 
FROM Student st 
LEFT OUTER JOIN Student_Course sc ON sc.StudentId = st.StudentId 
LEFT OUTER JOIN Course c ON c.CourseId = sc.CourseId AND CourseId = 1 
WHERE c.CourseId IS NULL 
AND st.Active = 1 
ORDER BY st.StudentAlias 

把課程檢查ON條款

+0

嗨,測試了您的查詢,但仍然輸出一組空的結果 – user2048994 2013-03-01 11:07:07

+0

這就是您的測試數據。唯一活躍的學生是ID 1,2,4和5,他們都有課程。 – Kickstart 2013-03-01 11:10:22

+0

這將返回所有活躍學生的列表,但未註冊/任何/課程。您應該爲特定課程ID添加連接條件。 – 2013-03-01 11:11:45

相關問題