我正在尝试创建一个SQL数据库查询,我需要获取学生的标记。更具体:我需要通过标记,主题,学生主题,学生一直加入,因为我不能只选择所有标记,而是来自特定学生的特定主题的标记。有任何想法吗?
我做了一个垃圾请求,因为失败而选择了所有标记。我会感谢任何帮助。
我的原始查询:
SELECT Value
FROM Mark
JOIN Subject ON Mark.SubjectID = Subject.ID
JOIN StudentSubject ON StudentSubject.subjectID = Subject.ID
JOIN Student ON StudentSubject.studentID = Student.ID
WHERE Student.NameStudent = 'Mira'
答案 0 :(得分:1)
您可以执行此类联接并根据需要修改过滤:
select
st.namestudent,
st.surname,
c.nameclass,
su.namesubject,
m.value
from studentsubject ss
inner join student st on st.id = ss.studentid
inner join subject su on su.id = ss.subjectid
left join mark m on
ss.studentid = m.studentid
and ss.subjectid = m.subjectid
left join class c on
c.id = st.classid
where
st.namestudent = 'Mira'
and su.namesubject = 'Science'
and c.classname = '10A'
答案 1 :(得分:0)
SELECT *
FROM Student St, Mark M, Subject Su
WHERE St.ID = M.StudentID
AND M.SubjectID = Su.ID
AND St.NameStudent = 'me'
AND Su.NameSubject = 'sql';
我要警惕带循环的关系图。该标记不应该在Student [Takes] Subject表中,或者您真的需要StudentSubject吗?
答案 2 :(得分:0)
“我不能只选择所有标记,而是从特定学生中选择特定科目的标记。”
当你知道学生的ID和主题的ID时(你应该,因为他们唯一地标识实体;名称不是),那么一个简单的SELECT Value FROM Mark WHERE StudentID = ... AND SubjectID = ...
就足够了。
如果你坚持根据名字进行选择,那么两个连接就足够了;一个为学生,一个为主题。
SELECT Value
FROM Mark m
INNER JOIN Student st ON st.ID = m.StudentID
INNER JOIN Subject su ON su.ID = m.SubjectID
WHERE st.NameStudent = 'Mira'
AND su.NameSubject = 'Math'
在这种情况下,表StudentSubject
似乎无关紧要;注册学生是否遵循课程可能是有用的,但不保证任何商标的存在。不过,您可以决定让Mark
引用StudentSubject
而不是两个单独的表。它会简化你的ER图。