Serverul dur SQL se alăture interogării

Creez o cerere pentru examenul meu de semestru, care va avea loc în 20 de zile. Aplicația mea ar trebui să ajute profesorii să construiască mai ușor programul nostru de facultate.

Lucrez cu o abordare bazată pe baze de date (Sql Server 2008 și Delphi XE2). Am câteva mese care descriu structura formațiunilor studențești. Deci, am Years , Series , Specializations , Groups și SemiGroups . Ca și în imagine Ani conține Series , Series codul> Grupurile și Grupurile pot conține sau nu SemiGroups . Am, de asemenea, tabele cu Cursuri , Profesori , ClassRooms , Zilele și Intervalul orar .

Există câteva condiții:

  1. Un profesor poate lua un curs cu una sau mai multe specializări sau cu unul sau mai multe grupuri sau cu unul sau mai multe grupuri semigrupuri.

  2. Cea de-a doua condiție este aceea că Cursurile sunt de 3 tipuri: Cursul de predare, Seminarul, Laboratorul (numai două din trei posibile pentru fiecare CourseName) (stocate în coloana Scheduler.CourseType char (3))

  3. Al treilea: Cursurile pot fi păstrate în toate săptămânile semestrului sau în numerele de odihna sau în săptămânile care pot fi divizate cu 2. (stocate în coloana Scheduler.Week char (3))

Așadar, stochez corelațiile într-un SchedulerTable.

 introduceți descrierea imaginii aici

Deci, dacă un grup are un curs cu un anumit profesor, voi introduce doar codurile corespunzătoare.

Am construit aproape toate datele care introduc formulare și acum sunt la partea de raportare a cererii. Folosesc raportul de servicii din MSSQL 2008. Vreau să listați un planificator care să includă toate corelațiile pentru o anumită specializare (care include Grupuri și/sau Semigrupuri). Am reușit să arăt toate corelațiile pentru grupurile care aparțin anumitor specializări, dar nu reușesc să arăt și alte cursuri de specializare și seminigrupuri.

Aceasta este interogarea care îmi întoarce corelațiile de grupuri dintr-o anumită specializare.

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

Dar vreau să reintroducă corelații pentru grupurile de semi-grupuri, grupuri și specializări pentru acea specializare. Am încercat să adaug un link cu acest Scheduler.SemiGroupID = Semigroups.SemigroupID dar interogarea returnează 0 rezultate atunci. Nu știu dacă se poate face ceea ce vreau, dar voi fi recunoscător tuturor celor care îmi indică o idee. Sau ar trebui să folosesc o altă structură pentru tabelul meu de corelații ( SchedulerTable ).

This is a sample report (a PDF file) which I would like to get:

Editați motivul: o explicare mai bună a problemei

0
@ Tony: Vreau să vă mulțumesc pentru interesul față de întrebarea mea; am editat-o ​​și am pus codul pentru interogarea mea.
adăugat autor Cristian Vasuica, sursa
Nu sunt sigur că vă primesc semi-grupuri pe specializare pare un pas simplu, având în vedere că ați făcut grupuri pe specializare. Puteți pune interogarea pe care ați făcut-o în întrebare?
adăugat autor Tony Hopkinson, sursa
Am eliminat eticheta Delphi XE2, deoarece această întrebare nu are absolut nimic de-a face cu Delphi; este strict o întrebare SQL Server.
adăugat autor Ken White, sursa

1 răspunsuri

Deci, de ce nu este soluția asta?

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

Desi voi recunoaste o frunte brazda despre daca ID-ul grupului in Schedules a fost numarul grupului din SemiGroupID in acel rand. Se pare că acest bit nu este normalizat.

0
adăugat
@ Tony-Am făcut un test de Tabelul Scheduler care are 25 de înregistrări. 5 înregistrări cu SpecID, 15 înregistrări cu GroupID și alte 5 cu SemiGroupID. Toate aceste 25 de înregistrări aparțin unei anumite specializări. Când rulez interogarea, returnează numai înregistrările aparținând grupului. Despre normalizare nu stiu unde gresesc pentru ca o Specializare apartine unei Serii, un Grup apartine unei Specializari, un SemiGroup apartine unui Grup. Vrei sa-mi dai mai multe sugestii?
adăugat autor Cristian Vasuica, sursa
Da, aș putea avea un grup fără semigrupuri. Nu sunt sigur că înțeleg ce vrei să spui. Vă voi arăta felul în care intru în înregistrările din tabelul de programe: Să presupunem că am o specializare numită SpecInformatics și acest special are două grupuri. Fiecare grup conține 2 semigrupuri. Când vreau să pun la bază Semigroup1 din Group1 of Informatics, introduc doar în SemiGroup1ID. Nu introduc Group1ID sau SpecInformaticsID. Fac greșit? Ar trebui să introduc și SpecInformaticsID și Group1ID?
adăugat autor Cristian Vasuica, sursa
Am încercat uniunea, dar amestecul este în jurul rezultatelor și nu sunt corecte în acest fel. Poate că o fac greșit.Cu toate acestea, voi extrage pentru moment corelarea individuală pentru Specializare, Grupuri și Semigrupuri. Când voi "înțelege", sper că voi rezolva asta. vă mulțumesc din nou pentru sprijinul dvs.!
adăugat autor Cristian Vasuica, sursa
@CristianVasuica, poti avea grupuri fara grupuri semi? Problema pare a fi. În Scheme puteți avea un grup și un grup semigrup unde grupul în semigrupuri a fost un grup diferit.
adăugat autor Tony Hopkinson, sursa
Greșit ar fi o chestiune de opinie, fiind simplu înșelată de numele coloanelor.
adăugat autor Tony Hopkinson, sursa
Nu-mi dau seama dacă-mi lipsește ceva aici. Mi se pare că aveți nevoie să uniți trei întrebări, unul pentru specialitate, unul pentru grupuri și unul pentru grupuri semigrupabile.
adăugat autor Tony Hopkinson, sursa