2012-06-02 3 views
0

Я создаю приложение для моего экзамена semestre, которое состоится через 20 дней. Мое приложение должно помочь учителям более легко построить наш факультетский график.Tough Sql Server Join Query

Я работаю с подходом базы данных (Sql Server 2008 и Delphi XE2). У меня есть несколько таблиц, описывающих структуру студенческих образований. Поэтому у меня есть Years, Series, Specializations, Groups и SemiGroups. Как и в изображении Years содержит Series, Series содержат Specializations, Specializations содержит Groups и Groups может содержать или не SemiGroups. У меня также есть таблицы с Courses, Teachers, ClassRooms, Days и HourlyIntervals.

Есть несколько условий:

  1. Учитель может взять курс с одним или несколькими специализаций, а также с одним или несколькими группами, или с одним или несколькими полугруппами.

  2. Второе условие состоит в том, что курсы имеют 3-х типов:. TeachingCourse, семинария, Лаборатория (только два из трех возможных для каждого CourseName) (хранится в столбце Scheduler.CourseType полукокса (3))

  3. третьи: Курсы могут быть во всех неделях семестра, или в oddweek чисел, или в неделях числа Dividable на 2. (хранится в столбце Scheduler.Week полукокса (3))

Я сохраняя корреляции в SchedulerTable.

enter image description here

Так что, если группа имеет курс с определенным учителем я представлю только соответствующие идентификаторы.

Я построил почти все формы ввода данных, и теперь я нахожусь в части отчетности приложения. Я использую службы отчетов из MSSQL 2008. Я хочу перечислить планировщик, который будет включать все корреляции для определенной специализации (в которую входят группы и/или полугруппы). Мне удалось показать все корреляции для групп, принадлежащих к этим определенным специализациям, но я не могу показать все курсы специализации и полугрупп.

Это запрос, который возвращает мне корреляции групп из определенной специализации.

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 

Но я хочу, чтобы он вернул связки для полугрупп, групп и специализации для этой определенной специализации. Я попытался добавить соединение с этим Scheduler.SemiGroupID = Semigroups.SemigroupID, но запрос возвращает 0 результатов. Я не знаю, можно ли сделать то, что я хочу, но я буду благодарен всем, кто указывает мне на мысль. Или я должен использовать другую структуру для моей таблицы корреляций (SchedulerTable).

This is a sample report (PDF-файл), который я хотел бы получить:

Редактировать Причина: Лучше объяснить вопроса

+1

Я удалил тег Delphi XE2, потому что этот вопрос не имеет ничего общего с Delphi; это вопрос SQL Server. –

+0

Не уверен, что я получаю вам полугруппы по специализации, кажется простым шагом, если вы сделали группы по специализации. Можете ли вы поставить запрос, который вы сделали в вопросе? –

+0

@ Тони: Я хочу поблагодарить вас за интерес к моему вопросу; я отредактировал его и поместил код для моего запроса. –

ответ

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 

Хотя я признаю, к морщинам лба о том, в списках был GroupID GroupID из SemiGroupID в этой строке. Похоже, что бит не нормализуется.

+0

@ Тони, у меня есть тестовая таблица планировщика, в которой есть 25 записей. 5 записей с SpecID, 15 записей с GroupID и еще 5 с SemiGroupID. Все эти 25 записей принадлежат к определенной специализации. Когда я запускаю запрос, он возвращает только записи, принадлежащие GroupID. О нормализации я не знаю, где я ошибаюсь, потому что специализация принадлежит к Серии, группа принадлежит к специализации, полугруппа принадлежит группе. Пожалуйста, не могли бы вы дать мне более конкретные предложения? –

+0

@CristianVasuica, можете ли вы иметь группу без полугрупп? Кажется, проблема. В Schedules вы можете иметь группу и полугруппу, в которой группа в полугруппах была другой группой. –

+0

Да, у меня могла бы быть группа без полугрупп. Я не уверен, что понимаю, что вы имеете в виду. Я покажу вам, как я вхожу в записи в таблице расписаний. Предположим, у меня есть специализация с именем SpecInformatics, и этот специальный раздел имеет две группы. Каждая группа содержит 2 полугруппы. Когда я хочу установить для Semigroup1 группы 1 информатики, я представляю только таблицу SemiGroup1ID в таблице. Я не представляю Group1ID или SpecInformaticsID. Я делаю это неправильно? Должен ли я вводить SpecInformaticsID и Group1ID? –