我有两张桌子:
User(LoginID,Password,Email,UserType) -- Primary key(LoginID)
Class(CourseCode, Semester,Year,ClassTime,ProID) -- Primary key(CourseCode, Semester,Year) -- Foreign key(ProID)
UserType可以是教师,助教(TA)或学生。 现在我不知道在哪里可以添加TA属性,以便一个班级有一个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
但它不起作用!
答案 0 :(得分:1)
嗯,最直接的解决方案是让Class
两次引用User
来实现教师和TA。所以 - 两个字段,我推荐TeacherID和AssistandID。
另一方面,User
应该引用Class
来实现类成员身份。
但是,我认为您的User
表格应为Student
。
另一件事是你应该为教师准备另一张桌子,比如Teacher
,在那里你可以填满你的老师和MAYBE TA。这取决于您的老师/ TA附带的字段是否相同。否则,应该有另一个表TeacherAssistant
或Assistant
。
最后,如果你必须有一个表格,数据库中的所有用户都在这里,那些是教师,TA和学生,请随时拥有Users
表,但是应该从{Teachers
表中引用它。 {1}},Assistants
和Students
。
总结一下,你应该有这些表来满足你的要求:
另一件事 - 在当代应用程序中,将ID作为PK更容易。我相信你的PK是一个有效的PK候选者,但是在你的表中将自动增量/身份/序列ID作为PK,并且真正的PK候选者作为唯一密钥更容易(并且正在成为惯例)。有关详细信息,请see this discussion。所以,如果我错了,请纠正我,但这确实让我的ORM(实体框架)感到高兴。
修改强>
在您当前的解决方案中,如果遵循......
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