我有一个关于我想要执行但不知道如何编写它的SQL的问题。以下是具有如此虚拟数据的表格:
模块:
ModuleId (PK auto) ModuleNo ModuleName
1 CHI2523 Business
课程:
CourseId (PK auto) CourseName
1 Business and Computing
2 ICT
3 Sports
Course_Module:
CourseId (PK) ModuleId (PK)
1 1
2 1
会话
SessionId (PK auto) SessionName ModuleId (FK)
3 DFRER 1
学生:
StudentId (PK auto) StudentAlias StudentForename StudentSurname CourseId (FK)
1 u03824 Bill Murphy 1
2 u38492 Conrad Jones 2
3 u48383 Jane Peters 1
4 u34322 Morgan Gray 2
5 u39292 Bilal Tuddy 3
Student_Session:
SessionId (PK) StudentId (PK)
3 1
3 2
我希望查询能够找到的是所有剩余的学生,他们目前没有参加选定的评估但是能够清晰地参加评估。
为了能够做到这一点,我们必须:
在SessionId
表
Session
,查看所选会话的内容
查看SessionId
表格中的ModuleId
,了解Session
所属的模块。
查看ModuleId
表
Course_Module
所在的课程
通过查看学生表中与CourseId
表
CourseId
匹配的Course_Module
来查找每个学生的课程
显示属于该模块所在课程的所有学生,但仅显示目前不在会话中的学生(或者换句话说,不在Session
表中的学生选择{{ 1}}。
因此,如果选择的SessionId
为3,则应输出的学生为:
SessionId
这是因为:
StudentId (PK auto) StudentAlias StudentForename StudentSurname CourseId (FK)
3 u48383 Jane Peters 1
4 u34322 Morgan Gray 2
3属于SessionId
1
ModuleId
属于ModuleId
1和2
查看CourseId
1和2,有4名学生参加该课程
但其中有2名学生在查看CourseId
表时已经开始SessionId
3,所以只显示其他2名学生,因为他们目前没有参加会议
我的问题是如何编写查询以便能够实现上述示例?我已经开始查询,但需要有人的帮助来增强它,以便它符合上述示例的要求:
Student_Session
我不知道如何查看哪些学生/哪些学生不易读,然后只选择那些能够进行评估而且目前没有参与评估的学生
答案 0 :(得分:3)
SELECT e.*
FROM Session a
INNER JOIN Module b
ON a.ModuleID = b.ModuleID
INNER JOIN Course_Module c
ON b.ModuleID = c.ModuleID
INNER JOIN Course d
ON c.CourseID = d.CourseID
INNER JOIN Student e
ON d.CourseID = e.CourseID
LEFT JOIN Student_Session f
ON f.sessionID = a.SessionID AND
f.studentID = e.studentID
WHERE a.SessionID = 3 AND
f.studentID IS NULL
ORDER BY e.STUDENTALIAS
答案 1 :(得分:0)
SELECT s.StudentId, StudentAlias, StudentForename, StudentSurname
FROM Session s
INNER JOIN Module m ON m.ModuleId = s.ModuleId
INNER JOIN Course_Module cm ON cm.ModuleId = m.ModuleId
INNER JOIN Student s ON cm.CourseId = s.CourseId
LEFT OUITER JOIN Student_Session ss ON s.StudentId = ss.StudentId AND s.SessionId = 3
WHERE s.SessionId = 3
AND ss.SessionID IS NULL
ORDER BY StudentAlias;
左外连接允许您找出谁在Student_session中以及谁不在。
答案 2 :(得分:0)
我没有时间从您的数据中创建一些测试数据库,但我希望我的代码能为您提供一些提示,以及如何实现目标。
你不应该在没有冲动的情况下使用INNER JOIN。它们不利于请求性能,并且会在您不需要的情况下生成许多重复项。
也许您应该阅读本文以便更好地理解:http://www.w3schools.com/sql/sql_join.asp
SELECT s.* FROM Student AS s
# JOIN STUDENT SESSION
LEFT JOIN Student_Session AS ss
ON (ss.StudentId = s.StudentId AND ss.SessionId = 3)
# JOIN COURSE
LEFT JOIN Course_Module AS cm
ON s.CourseId = cm.CourseId
LEFT JOIN Session AS se
ON (cm.ModuleId = se.ModuleId AND se.SessionId = 3)
WHERE se.SessionId IS NOT NULL
AND ss.SessionId IS NULL
ORDER BY StudentAlias;