2010-07-26 16 views
1

假設我有以下各表SQL加入檢索比預期

Students (StudentId int Pk, StudentName nvarchar) 
Lectures (LectureId Pk, StartDate, EndDate) 
Enrollment (StudentID, LectureID) 

更多行時我執行以下查詢:

select StudentID From Students 

我拿到8行.. 當我執行:

select S.StudentID From Students S join Enrollment En On S.StudentID = En.StudentID 

我得到11行

爲什麼會這樣,以及如何在不檢索額外行的情況下使用連接?

+0

u得到11行coze一些學生有更多然後1個講座(如果u做一個選擇你會看到),你可以使用Distinct,所以你只會給學生一次,但我不認爲這解決了你的問題 – domiSchenk 2010-07-26 07:38:17

回答

3

你的加入沒問題。

這意味着每個學生有多個註冊 - 例如,學生們在一個以上的講座/系列講座

假設一個學生只能在同一時間註冊一個講座就讀,那麼你也將需要加入到演講和使用日期字段

而且,如果學生目前沒有註冊任何內容,則需要考慮左外連接。

所以你的查詢可能再像

SELECT S.StudentID FROM Students S 
LEFT OUTER JOIN Enrollment En On S.StudentID = En.StudentID 
INNER JOIN Lectures l ON en.LectureId = l.Lecture ID 
WHERE getdate() BETWEEN l.StartDate and l.EndDate 

但是,你需要有適當的規則,以確保學生不能同時註冊多個演講(如果這確實是你所期望的)

HTH

0

使用LEFT JOIN

編輯:請不要介意,這是作爲所述低於/高於/不管。你必須讓學生有多個講座/註冊。你需要按學生分組,再次獲得8行。

選擇S.StudentID從學生小號 參加招生恩在S.StudentID = En.StudentID 組由S.StudentID

+0

大部分。無用。回答。永遠。 – cjk 2010-07-26 07:42:56