3

我有一个关于我想要执行的 SQL 的问题,但不知道如何编写它。以下是具有如此虚拟数据的表格:

模块:

ModuleId (PK auto) ModuleNo   ModuleName
1                  CHI2523    Business

课程:

CourseId (PK auto)  CourseName
1                    Business and Computing
2                    ICT
3                    Sports

课程_模块:

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

学生会话:

SessionId (PK)  StudentId (PK)
3               1
3               2

我希望查询能够找到的是所有剩余的当前未参加所选评估但可以清楚地参加评估的学生。

因此,为了能够做到这一点,我们必须:

  • SessionId通过在Session表中查找来查看所选会话是什么

  • 通过查看表中SessionId的来查看属于哪个模块。ModuleIdSession

  • ModuleId通过Course_Module查表查看哪些课程

  • 通过查看与表中的'sCourseId匹配的学生表来查找每个学生的课程CourseIdCourse_Module

  • 显示属于该模块所在课程的所有学生,但只显示当前不在会话中的学生(或者换句话说,不在Session表格中选择所选SessionId.

所以如果SessionId选择的是 3,那么它应该输出的学生是:

StudentId (PK auto)  StudentAlias StudentForename  StudentSurname  CourseId (FK)
3                    u48383       Jane             Peters          1
4                    u34322       Morgan           Gray            2

这是因为:

  • SessionId3属于ModuleId1

  • ModuleId属于CourseId1 和 2

  • 查找CourseId1 和 2 有 4 名学生参加了该课程

  • SessionId但是其中 2 名学生在查看 Table 时已经参加了3Student_Session次,因此只显示其他 2 名学生,因为他们目前没有参加课程

我的问题是如何编写查询以实现上述示例?我已经开始查询,但需要有人帮助来增强它,以便它符合上面示例的要求:

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
INNER JOIN Student_Session ss ON s.StudentId = ss.StudentId
WHERE s.SessionId = 3
ORDER BY StudentAlias;

我不知道如何检查哪些学生是/不清晰,然后只选择那些可以参加评估但目前没有参加评估的学生

4

3 回答 3

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
于 2013-01-10T00:46:40.700 回答
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 中,谁不在。

于 2013-01-10T00:51:45.207 回答
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;
于 2013-01-10T01:10:19.113 回答