2012-06-02 43 views
0

我正在爲我的semestre考試建立一個應用程序,將在20天內進行。我的應用程序應該幫助教師更輕鬆地構建我們的教師時間表。艱難的SQL服務器加入查詢

我正在使用數據庫方法(Sql Server 2008和Delphi XE2)。我有幾張描述學生編隊結構的表格。所以我有YearsSeriesSpecializationsGroupsSemiGroups。像在圖中Years包含Series, Series包含Specializations, Specializations, 和Groups可能包含或不包含SemiGroups。我也有Courses,Teachers,ClassRooms,DaysHourlyIntervals的表格。

有幾個條件:

  1. 教師可以參加課程與一個或多個專業化,或與一個或多個組,或者與一個或多個半羣。

  2. 的第二個條件是,課程3種類型的:TeachingCourse,學院,實驗室(從三種可能的對每個CourseName只有兩個)(存儲在列Scheduler.CourseType炭(3))

  3. 第三個:課程可以保持在一個學期的所有周,或在oddweek號碼,或在週數可分割由2(存儲在列Scheduler.Week炭(3))

所以我將相關性存儲在SchedulerTable中。

enter image description here

所以,如果一個集團有一定的教師,我將只推出相應的ID的過程。

我構建了幾乎所有的數據介紹表單,現在我在報表部分的應用程序。我正在使用MSSQL 2008中的報告服務。 我想列出一個調度程序,該調度程序將包含特定專業化(包括組和/或半羣)的所有相關性。我已經設法顯示屬於某些專業領域的小組的所有相關性,但我無法設法顯示專業化和半羣體課程。

這是一個查詢,它返回來自某個Specialization的組關聯。

SELECT Days.DayName, HourlyIntervals.HourlyIntervalName, Scheduler.Week, Scheduler.CourseType, Courses.CourseName, ClassRooms.ClassRoomName, Teachers.TeacherName,Specializations.SpecName, Groups.GroupsName 
FROM Scheduler INNER JOIN 
     Groups ON Scheduler.GroupID = Groups.GroupID INNER JOIN 
     Days ON Scheduler.DayID = Days.DayID INNER JOIN 
     HourlyIntervals ON Scheduler.HourlyIntervalID = HourlyIntervals.HourlyIntervalID INNER JOIN 
     Teachers ON Scheduler.TeacherID = Teachers.TeacherID INNER JOIN 
     Courses ON Scheduler.CourseID = Courses.CourseID INNER JOIN 
     ClassRooms ON Scheduler.ClassRoomID = ClassRooms.ClassRoomID INNER JOIN 
     Specializations ON Groups.IDSpec = Specializations.IDSpec 

WHERE (Specializations.ID = @SpecID) 

ORDER BY Days.DayID, HourlyIntervals.HourlyIntervalID 

但是我想讓它返回SemiGroups,Groups和Specialization的相關關係。我試圖用這個Scheduler.SemiGroupID = Semigroups.SemigroupID添加一個連接,但查詢返回0結果。我不知道是否可以做到我想要的,但我會感謝任何給我指出主意的人。或者我應該使用其他結構作爲我的關聯表(SchedulerTable)。

This is a sample report(PDF文件),我想獲得:

編輯原因:更好的解釋這個問題

+1

我刪除了Delphi XE2標籤,因爲這個問題與Delphi完全無關;這完全是一個SQL Server問題。 –

+0

不確定我是否讓你獲得半羣每個專業化看起來是一個簡單的步驟,因爲你已經完成了每個專業的羣體。你可以把你所做的查詢放在問題中嗎? –

+0

@Tony:我想感謝你對我的問題的興趣;我編輯它,並把我的查詢代碼。 –

回答

0

的那麼,爲什麼不是這個解決辦法嗎?

SELECT Days.DayName, HourlyIntervals.HourlyIntervalName, Scheduler.Week, Scheduler.CourseType, Courses.CourseName, ClassRooms.ClassRoomName, Teachers.TeacherName,Specializations.SpecName, SemiGroups.GroupsName 
FROM Scheduler 
    INNER JOIN SemiGroups On Scheduler.SemiGroupId = SemiGroups.SemiGroupId   
    INNER JOIN Groups ON SemiGroups.GroupID = SemiGroups.Groups 
    INNER JOIN Days ON Scheduler.DayID = Days.DayID 
    INNER JOIN HourlyIntervals ON Scheduler.HourlyIntervalID = HourlyIntervals.HourlyIntervalID 
    INNER JOIN Teachers ON Scheduler.TeacherID = Teachers.TeacherID 
    INNER JOIN Courses ON Scheduler.CourseID = Courses.CourseID 
    INNER JOIN ClassRooms ON Scheduler.ClassRoomID = ClassRooms.ClassRoomID 
    INNER JOIN Specializations ON Groups.IDSpec = Specializations.IDSpec 

WHERE (Specializations.ID = @SpecID) 
ORDER BY Days.DayID, HourlyIntervals.HourlyIntervalID 

雖然我承認一個緊鎖眉頭關於羣ID是否在附表是SemiGroupID的羣ID是排。看起來喜歡那個位沒有正常化。

+0

@ Tony-I完成了一個包含25條記錄的測試調度表。帶有SpecID的5條記錄,帶GroupID的15條記錄以及帶有SemiGroupID的另外5條記錄。所有這25條記錄都屬於某個專業領域。當我運行查詢時,它只會返回屬於GroupID的記錄。關於正常化我不知道我錯在哪裏,因爲專業化屬於一個系列,一個集團屬於一個專業化,一個半集團屬於一個集團。請問,你能否給我更具體的提示? –

+0

@CristianVasuica,你可以組沒有半團體嗎?這個問題似乎是。在計劃中,您可以有一個組和半羣,其中半羣中的羣組是不同的羣組。 –

+0

是的,我可以有一個沒有半羣的組。我不確定我明白你的意思。我會告訴你我在Schedules Table中輸入記錄的方式:假設我有一個名爲SpecInformatics的專門化,這個專題有兩個組。每個組包含2個半羣。當我想爲信息學組1的Semigroup1設置時,我只在表格中引入了SemiGroup1ID。我沒有引入Group1ID或SpecInformaticsID。我做錯了嗎?我是否也應該輸入SpecInformaticsID和Group1ID? –