テーブル間の関係を示すために WHERE 句を使用する代わりに、JOIN 条件を使用する現在の SQL 構文を使用することから始めます。このようにして、すべてのテーブルの関連付けを完了し、これらの要素が構成されていることを視覚的に確認することができます...次に、探している基準を追加します。
ここで行ったことは、登録されたすべての Jaci のクラスと、建物「BG」のクラスのみを取得する PreQuery (結果エイリアス "JaciClassesInBG" ) を作成することです (ロケーション テーブルの JOIN 句に追加されました)。 . WHERE 句は Jaci だけのものでした。
その結果から、Jaci が取ったすべてのクラスのリストができました。彼女の ID、S_Level、および C_SE_ID エントリを取得しました。
そこから、Jaci が取得した C_SE_ID に明示的に基づいて、他のすべての学生の登録テーブルに参加するだけです (したがって、まったく同じクラスのすべての学生)。しかし、リストから Jaci の学生 ID を除外しました (AND NOT... を介して)... 彼女がクラスを受講したことはわかっています。
最後に、共通の登録に基づいて、その結果を学生テーブルに結合します。これで、Jaci の共通の「S_LEVEL」基準をそれらの生徒に関連付けることができます...
これで、表示したい詳細を取得できます... この場合、私は各生徒と、Jaci と共通のクラスを取得しています。1 人の生徒が複数のクラスに参加している場合があります。これでそれぞれ表示されます。1 つのインスタンスだけを気にする場合は、トップを次のように変更します...
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