0

私は2つのテーブルを持っています:

User(LoginID,Password,Email,UserType) --  Primary key(LoginID)
Class(CourseCode, Semester,Year,ClassTime,ProID) -- Primary key(CourseCode, Semester,Year) -- Foreign key(ProID)

UserType は、教師、ティーチング アシスタント (TA)、または学生のいずれかです。1 つのクラスに 1 つの TA と 1 つの教師が含まれるように、どこに TA 属性を追加できるかわかりません。TAID を外部キーとして User テーブルに入れることを考えているので、次のようになります。

Class(CourseCode, Semester,Year,ClassTime,ProID,TAID)

しかし、それが正しいかどうかはわかりません。特定の科目を担当している先生やTAの名前を取得したいのですが、うまくいきません。以下のクエリを試しました。

SELECT dbo.[User].Name
FROM  dbo.Class INNER JOIN
           dbo.[User] ON dbo.Class.ProID = dbo.[User].LoginID AND dbo.Class.TAID = dbo.[User].LoginID
WHERE CrsCode=@CrsCode and Semester=@Semester and Year=@Year 

質問:この問題について何か考えがある人はいますか? 前もって感謝します。

編集: 私は書いた:

alter proc SelectFacultyNameByID
@CrsCode nvarchar(5),
@Semester nvarchar(20),
@Year int
as
SELECT 
u1.Name as Teacher,
u2.Name as Assistant
FROM
dbo.Class c
JOIN [User] u1
 ON c.ProID = u1.LoginID
JOIN [User] u2
ON c.TAID = u2.LoginID
WHERE 
c.CrsCode = @CrsCode 
AND c.Semester = @Semester 
AND c.Year = @Year

しかし、うまくいきません!

4

1 に答える 1

1

まあ、最も簡単な解決策は、教師と TA を実装するために 2 回Class参照することです。Userだから - 2 つのフィールド、TeacherID と AssistandID をお勧めします。

他の方向では、クラス メンバーシップを実装するためUserの参照が必要です。Class

ただし、UserテーブルはStudent. もう 1 つのことはTeacher、教師と MAYBE TA を詰め込む のような、教師用の別のテーブルを用意する必要があるということです。教師/TA に付随するフィールドが同じかどうかによって異なります。それ以外の場合は、別のテーブルTeacherAssistantまたはAssistant.

最後に、データベース内のすべてのユーザーが存在し、それらが教師、TA、学生であるテーブルが必要な場合は、自由にテーブルを作成できますが、 、からUsersの参照が必要です。TeachersAssistantsStudents

要約すると、要件を満たすには、おそらく次の表が必要です。

  • クラス (ID、TeacherID、AssistantID、...)
  • 教師 (ID、名前、...、ユーザー ID)
  • アシスタント (ID、名前、...、ユーザー ID)
  • 学生 (ID、名前、ClassID、...、UserID)
  • ユーザー (ID、名前、...)

もう 1 つ - 現代のアプリケーションでは、ID を PK として持つ方が簡単です。あなたのPKは有効なPK候補だと思いますが、自動インクリメント/アイデンティティ/シーケンスIDをテーブルのPKとして、実際のP​​K候補を一意のキーとして持つ方が簡単です(そして慣例になりつつあります)。詳細については、このディスカッションを参照してください。SO、私が間違っている場合は修正してください。しかし、それは私の ORM (Entity Framework) を本当に幸せにします。

編集

現在のソリューションでは、次の場合...

SELECT u.Name
FROM
  dbo.Class c
  JOIN [User] u 
    ON c.ProID = u.LoginID
WHERE 
  c.CrsCode = @CrsCode 
  AND c.Semester = @Semester 
  AND c.Year = @Year 

...その年/学期のそのようなクラスのすべての教師名を意味します.

SELECT u.Name
FROM
  dbo.Class c
  JOIN [User] u 
    ON c.ProID = u.LoginID
    AND c.TAID = u.LoginID
WHERE 
  c.CrsCode = @CrsCode 
  AND c.Semester = @Semester 
  AND c.Year = @Year 

...その年/学期のそのようなクラスについて、同じ教師と教師アシスタントを持つすべてのクラスを見つけて、それらの名前を出力することを意味します。

おそらく次のものが必要です。

SELECT 
  Teacher = u1.Name,
  Assistant = u2.Name
FROM
  dbo.Class c
  JOIN [User] u1
    ON c.ProID = u1.LoginID
  JOIN [User] u2
    ON c.TAID = u2.LoginID
WHERE 
  c.CrsCode = @CrsCode 
  AND c.Semester = @Semester 
  AND c.Year = @Year
于 2013-07-24T07:29:56.327 に答える