1

我需要一些有关此 SQL 查询的帮助。它旨在检索与 Jaci Walker 具有相同 S.S_level 值的学生的姓名,并在 BG 大楼中与 Jaci Walker 一起学习课程 (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");
4

3 回答 3

0

我将首先使用使用 JOIN 条件的当前 SQL 语法而不是使用 WHERE 子句来显示表之间的关系。这样,您就可以完成所有表格关联,并且可以更好地直观地确认您已配置这些元素......然后,添加您正在寻找的标准。

我在这里所做的只是有一个 PreQuery(结果别名“JaciClassesInBG”),它获取所有注册的 Jaci 课程,并且只有那些用于建筑物“BG”的课程(已添加到位置表的 JOIN 子句中) . WHERE 子句仅适用于 Jaci。

根据这个结果,我列出了 Jaci 上过的所有课程。我抓住了她的 ID、S_Level 和 C_SE_ID 条目。

从那以后,只需根据 Jaci 所采用的 C_SE_ID 显式加入所有其他学生的注册表(因此所有学生都在同一个班级)。但是,我已经从列表中排除(通过而不是......)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
于 2013-05-24T14:51:35.880 回答
0

如果无法访问我无法测试的数据,但以下可能会有所帮助(第一个内部选择正在拉回所有相关的 C_SE_ID)

SELECT S.S_Fname, S.S_Lname
FROM Student S, Enrollment E
WHERE S.S_id = E.S_id
        AND E.C_SE_ID IN (SELECT CS.C_SE_ID
        FROM Student S2, Enrollment E2, CourseSection CS, Location L
        WHERE S2.S_id = E2.S_id
                AND E2.C_SE_ID = CS.C_SE_ID
                AND CS.Loc_id = L.Loc_id
                AND L.Blodg_code = 'BG'
                AND S2.S_Fname = 'Jaci'
                AND S2.S_Lname = 'Walker')
        AND S.S_Level = (SELECT S3.S_Level
        FROM Student S3
        WHERE S3.S_Fname = 'Jaci'
                AND S3.S_Lname = 'Walker')
        AND S.S_Fname <> 'Jaci'
        AND S.S_Lname <> 'Walker'

我建议在内部查询(例如 S2、E2)中使用不同的别名以避免混淆。

于 2013-05-24T14:06:45.377 回答
0

如果我正确理解这个问题,这应该有效:

SELECT s.S_Fname, s.S_LName
FROM Student s

INNER JOIN Enrollment e ON s.S_id = e.S_id
INNER JOIN CourseSection cs ON e.C_SE_ID = cs.C_SE_id
INNER JOIN Location l ON cs.Loc_ID = l.Loc_id

INNER JOIN Student s2 ON s.S_Level = s2.S_Level AND s2.S_Fname = "Jaci" AND s2.S_Lname = "Walker"
INNER JOIN Enrollment e2 ON s2.S_id = e2.S_id
INNER JOIN CourseSection cs2 ON e2.C_SE_ID = cs2.C_SE_id

WHERE l.Loc_id = l.Blodg_code = "BG"
AND cs.Course_ID = cs2.Course_ID 

我目前无法测试,很快就完成了。也许可以找到更好的解决方案?

于 2013-05-24T13:06:28.517 回答