私は、SQL Server Management Studioを使用して学生タイムテーブルを表示し、それをVisual Studioプログラムにリンクするシステムを作成しています(問題は無関係ですが、コンテキストを追加するだけです)。私のデータベーステーブルを現時点で発行しており、私はいくつかの助けが必要です。SQLデータベース学生タイムテーブルシステム
私のプロジェクトの基本的な背景は、Lesson
,Student
およびSubject
という3つのテーブルがあるということです。テーブルには小さなテストサンプルデータセットが入力されます。
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
Subject
表:
SubjectID Title
---------------------------------
1 Computing
2 Maths
3 Economics
4 Physics
5 Geography
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
:
Lesson
テーブル - 外部キーSubject
テーブルとしてSubjectID
を介し>Subject
テーブル - それぞれの外部キーとしてSubjectID
を持つ>Student
Block1
介しテーブル、Block2
、Block3
とBlock4
、被験者に関連する各ブロックとその各生徒に最大4つの可能な科目を与えます
私の目的は、1日の値が1日と期間の値に対して実行されたときに1つの特異値が見つかるようにテーブルを照会することです個人はuserID
と入力され、その日および期間に個人が持っているレッスンが見つかります。
次のように火曜日期間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'));
そして、これが正常値2、すなわち、数学を返します。しかし
、例えば我々は火曜日の期間1にラッセル・ペンの値を検索した場合:それだけ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'));
は、その後の戻り値は、数学の2つのすなわち3値の3値であり、私が追加したブロッキング制約の中で、1日目の火曜日には1つの数学値しかないので、数学の価値があります。
ブロック1とブロック4の両方で数学が交差することは知っていますが、これが理念です.blockLessonIsInは、数学が属する特定のブロックに関連するレッスンのみを選択する必要があるという事実を是正することを目的としています
私のデータベース設計には重大な問題がありますか、それとも私がばかげて逃したような目障りなエラーですか。データベースは、DayOfWkやPeriodValueなどの値を渡すために既に作成されたプログラムに組み込まれていますので、これは私を後押ししている唯一のものですが、数学の3つの値が選択されている場所はまったく分かりません。
時刻表には不要な列があるので、引用されていない場合(つまり、レッスンテーブルのルーム)には無視してください。
私のプログラムや、私が言及したことを忘れているかもしれないこと、または私が特定のコード行で達成しようとしていることについてもっと詳しく調べる必要があるものについて質問がある場合は、私のプログラムの主要な障害です。
ご協力いただきありがとうございます。
を構築します。 – Jayzaaa
正規化を読む必要があります。あなたはBlock1、Block2等を持ってはいけません。それらは別のテーブルの行でなければなりません。 –
それは私が知っている想像力のあらゆるストレッチで最も効率的な方法ではありませんが、それは可能ですか?私は前に働いていましたが、数学のブロック4から数学のレッスンを追加すると、この問題が生まれました。これが修正できない場合は、正規化を使用して効率化するために使用できる提案はありますか? – Jayzaaa