2012-06-02 42 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? –