我需要有关此SQL查询的帮助。它旨在检索具有与Jaci Walker相同的S.S_level值的学生的姓名,并已与Jaci Walker一起在BG建筑物中上过课程(CS.C_SE_id)。
我在第7行遇到了麻烦。我需要确保人们与Jaci Walker参加的课程相同。我不确定该部分的WHERE语句中应包含什么内容。
数据库模式可以在这里看到:
SELECT S.S_Fname, S.S_LName
FROM Student S, Enrollment E, CourseSection CS, Location L
WHERE S.S_id = E.S_id
AND E.C_SE_ID = CS.C_SE_id
AND L.Loc_id = CS.Loc_ID
AND S.S_Level = (SELECT S.S_Level FROM Student S WHERE S.S_Fname = "Jaci" AND S.S_Lname = "Walker")
AND CS.C_SE_id = (SELECT CS.C_SE_id FROM CourseSection CS WHERE **?**)
AND L.Loc_id = (SELECT L.Blodg_code FROM Location L WHERE L.Blodg_code = "BG");
最佳答案
我将从使用当前的SQL语法和JOIN条件开始,而不是使用WHERE子句显示表之间的关系。这样,您就可以完成所有表的关联,并且可以更好地从视觉上确认您已配置了那些元素...然后,根据要查找的条件进行操作。
我在这里所做的只是拥有一个PreQuery(结果别名为“ JaciClassesInBG”),该查询获取所有已注册的Jaci类,并且仅包含用于构建“ BG”的类(已将其添加到位置表的JOIN子句中) 。 WHERE子句仅适用于Jaci。
根据该结果,我列出了Jaci参加的所有课程。我抓住了她的ID,S_Level和C_SE_ID条目。
然后,仅根据Jaci所使用的C_SE_ID(因此完全属于同一班级的所有学生),直接返回所有其他学生的注册表。但是,我已经从列表中排除了(通过AND NOT ...)Jaci的学生证...我们知道她参加了这堂课,我们正在寻找所有人。
最后,根据普通入学将结果返回学生表。现在,我们可以将Jaci的常见“ S_LEVEL”标准与这些学生相关联...
现在,您可以获得想要显示的任何详细信息...在这种情况下,我要抓住每个学生,以及他们与Jaci有何共同点。一名学生可能参加过多个课程。这将显示每个。如果您只关心一个实例,我只需将顶部更改为...
选择DISTINCT S2.S_FName,S2.S_LName ...
SELECT
JaciClassesInBG.Course_Code,
JaciClassesInBG.Course_Name,
S2.S_FName,
S2.S_LName
from
( SELECT
S.ID,
S.S_Level,
CS.C_SE_ID,
C.Course_Code,
C.Course_Name
FROM
Student S
JOIN Enrollment E
ON S.S_id = E.S_id
JOIN CourseSection CS
ON E.C_SE_ID = CS.C_SE_id
JOIN Location L
ON L.Loc_id = CS.Loc_ID
AND L.Blodg_Code = "BG"
JOIN Course C
ON CS.Course_ID = C.Course_ID
WHERE
S.S_Fname = "Jaci"
AND S.S_Lname = "Walker" ) JaciClassesInBG
JOIN
Enrollment E2
ON JaciClassesInBG.C_SE_ID = E2.C_SE_ID
AND NOT JaciClassesInBG.S_ID = E2.S_ID
JOIN Students S2
ON E2.S_ID = S2.S_ID
AND JaciClassesInBG.S_Level = S2.S_Level