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

テーブル間の関係を示すために 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
于 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 に答える