Système de calendar des étudiants SQL Database

Je crée un système qui affiche un emploi du time étudiant en utilisant SQL Server Management Studio et en le liant à un programme Visual Studio (ce qui n'est pas pertinent pour mon problème mais ajoute simplement du context), mais j'ai un problème majeur avec mes tables de database et j'ai besoin d'aide.

Le context de base de mon projet est qu'il y a 3 tables, une Lesson , un Student et un Subject . Les tables sont peuplées de petits sets de données d'échantillons de test.

Table de Lesson :

 LessonID DayOfWk PeriodValue SubjectID Room blockLessonIsIn ------------------------------------------------------------------- 1 Mon 2 1 G8 2 2 Mon 3 1 G8 2 3 Mon 4 1 G8 2 4 Mon 5 2 N5 1 5 Tue 1 3 SF5 4 6 Tue 3 2 N7 1 7 Wed 1 3 SF5 4 8 Wed 2 1 H9B 2 9 Wed 5 1 G8 2 10 Thu 1 3 SF4 4 11 Thu 3 2 N7 1 12 Thu 5 3 SF5 4 13 Fri 1 3 SF5 4 14 Fri 2 1 G8 2 15 Fri 3 1 H9B 2 16 Fri 4 2 SP2 1 17 Mon 1 5 H1 1 18 Tue 5 5 H1 1 19 Thu 3 5 H1 1 20 Fri 4 5 H1 1 21 Wed 4 4 S1 3 22 Fri 5 4 S1 3 23 Tue 1 2 N1 4 24 Tue 2 2 N1 4 25 Wed 1 2 N1 4 26 Thu 1 2 N1 4 27 Thu 4 2 N1 4 

Table de Subject :

 SubjectID Title --------------------------------- 1 Computing 2 Maths 3 Economics 4 Physics 5 Geography 

Table d' Student :

 UserID Forname Surname SchlYear InOrOut Block1 Block2 Block3 Block4 Pword ---------------------------------------------------------------------------------- 1 Jake Richardson 13 1 2 1 NULL 3 password 2 Russell Penn 13 1 5 1 NULL 2 russpass 3 Xander Sheppard 13 1 2 1 4 NULL xander 4 Dan Bostock 13 1 2 1 4 NULL pass 

Ces tables sont liées les unes aux autres via les éléments suivants:

  • Table de Lesson -> Table de Subject via SubjectID comme key étrangère
  • Table des Subject -> Table des Student via Block1 , Block2 , Block3 et Block4 avec un SubjectID comme key étrangère dans chaque bloc, avec chaque bloc relatif à un sujet qui donne à chaque étudiant un maximum de 4 sujets possibles

Mon but est d'interroger les tables afin qu'une valeur singulière puisse être trouvée lorsque la requête est exécutée pour une valeur de jour et de période avec un userID individuel, trouvant ainsi la leçon qu'un individu a ce jour et cette période.

La requête que j'ai actuellement est la suivante, si j'essaie de find par exemple la leçon de Jake Richardson le mardi 1:

 SELECT lesson.SubjectID FROM lesson_tbl AS lesson LEFT OUTER JOIN student_tbl AS subject1 ON lesson.SubjectID = subject1.Block1 LEFT OUTER JOIN student_tbl AS subject2 ON lesson.SubjectID = subject2.Block2 LEFT OUTER JOIN student_tbl AS subject3 ON lesson.SubjectID = subject3.Block3 LEFT OUTER JOIN student_tbl AS subject4 ON lesson.SubjectID = subject4.Block4 WHERE lesson.DayOfWk = 'Mon' AND lesson.PeriodValue = '5' AND ((subject1.UserID = '1' AND lesson.blockLessonIsIn = '1') OR (subject2.UserID = '1' AND lesson.blockLessonIsIn = '2') OR (subject3.UserID = '1' AND lesson.blockLessonIsIn = '3') OR (subject4.UserID = '1' AND lesson.blockLessonIsIn = '4')); 

Et cela returnnera avec succès la valeur 2, c'est-à-dire, Maths.

Cependant, si par exemple nous devions searchr la valeur de Russell Penn le mardi 1:

 SELECT lesson.SubjectID FROM lesson_tbl AS lesson LEFT OUTER JOIN student_tbl AS subject1 ON lesson.SubjectID = subject1.Block1 LEFT OUTER JOIN student_tbl AS subject2 ON lesson.SubjectID = subject2.Block2 LEFT OUTER JOIN student_tbl AS subject3 ON lesson.SubjectID = subject3.Block3 LEFT OUTER JOIN student_tbl AS subject4 ON lesson.SubjectID = subject4.Block4 WHERE lesson.DayOfWk = 'Tue' AND lesson.PeriodValue = '1' AND ((subject1.UserID = '2' AND lesson.blockLessonIsIn = '1') OR (subject2.UserID = '2' AND lesson.blockLessonIsIn = '2') OR (subject3.UserID = '2' AND lesson.blockLessonIsIn = '3') OR (subject4.UserID = '2' AND lesson.blockLessonIsIn = '4')); 

Alors les valeurs de return sont 3 valeurs de 2 soit 3 valeurs de maths, alors qu'il ne devrait returnner que 1 valeur de maths car il n'y a qu'une valeur de maths le mardi à la période 1 dans les contraintes de blocage que j'ai ajoutées.

Je suis conscient que les maths traversent à la fois le bloc 1 et le bloc 4, mais c'est l'idée, et le blockLessonIsIn vise à remédier au fait qu'il ne devrait sélectionner que les leçons qui se rapportent au bloc spécifique dans lequel les maths sont.

Y at-il quelque chose de fondamentalement faux avec ma design de database ou est-ce une erreur flagrante que j'ai bêtement manqué. La database sera moulée dans mon programme qui a déjà été créé pour transmettre les valeurs telles que DayOfWk et PeriodValue, ce qui est simplement la seule chose qui me retient, mais cela me laisse totalement perplexe quant à l'endroit où 3 valeurs de Maths sont sélectionnées.

S'il vous plaît noter qu'il ya des colonnes qui ne sont pas nécessaires pour l'emploi du time, donc si elles n'ont pas été citées (c.-à-d. Salle dans la table de leçon) les ignorer.

Si vous avez d'autres questions à propos de mon programme ou de tout ce que j'ai oublié de mentionner, ou si vous avez besoin de plus de détails sur ce que j'essaye de faire avec certaines lignes de code, posez la question car c'est la pierre d'achoppement mon programme.

Merci pour toute aide que vous pourriez être en mesure de fournir!

Je pense que vous pouvez avoir une corruption de données dans votre table Lesson. Après avoir lu votre question et ce que vous voulez faire, il me semble raisonnable de penser que chaque paire (Jour, Période) dans la Leçon devrait être unique. Par exemple, si un étudiant est dans la période de mercredi 1, alors nous devrions être en mesure de dire définitivement qu'il est en mathématiques. Ceci, cependant, ne semble pas être le cas. Si nous exécutons la requête suivante,

 select dayofwk, periodValue, COUNT(*) from lesson_tbl group by dayofwk, periodValue having COUNT(*) > 1 

nous obtenons les résultats suivants

 + ------- + ----------- + ----- + | dayofwk | periodValue | count | + ------- + ----------- + ----- + | thu | 1 | 2 | | tue | 1 | 2 | | wed | 1 | 2 | | thu | 3 | 2 | | fri | 4 | 2 | + ------- + ----------- + ----- + 

qui nous disent que ces combinaisons (jour, période) ne sont pas uniques. Si un étudiant est dans la période du mercredi 1, alors nous ne pouvons pas déterminer s'il est en mathématiques ou Econ.

Que faire d'ici

(1) Si vous ne croyez pas qu'une combinaison (jour, période) doit être unique dans la table des leçons, alors ce que vous voulez est impossible. Vous ne pourrez pas find "une valeur singulière" pour un (user, jour, période).

(2) Si vous pensez qu'une combinaison (jour, point) doit être unique dans la table Lesson, corrigez datatables corrompues. Ensuite, construisez la requête suivante

 declare @dayQuery varchar(3) = 'tue' declare @PeriodQuery int = 1 declare @userQuery int = 1 select * from lesson_tbl L inner join student_tbl U on case L.blockLessonIsIn when 1 then U.Block1 when 2 then U.Block2 when 3 then U.Block3 when 4 then U.Block4 end = L.subjectID where L.dayofwk = @dayQuery and L.periodValue = @PeriodQuery and U.userID = @userQuery