SQL数据查询连接表

时间:2015-10-24 19:12:39

标签: sql

我正在尝试创建一个SQL数据库查询,我需要获取学生的标记。更具体:我需要通过标记,主题,学生主题,学生一直加入,因为我不能只选择所有标记,而是来自特定学生的特定主题的标记。有任何想法吗?

我做了一个垃圾请求,因为失败而选择了所有标记。我会感谢任何帮助。

database diagram

我的原始查询:

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'

3 个答案:

答案 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图。