我需要有关此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

10-07 13:28