3

実行したいSQLについて質問がありますが、その記述方法がわかりません。以下は、非常にダミーのデータを含むテーブルです。

モジュール:

ModuleId (PK auto) ModuleNo   ModuleName
1                  CHI2523    Business

コース:

CourseId (PK auto)  CourseName
1                    Business and Computing
2                    ICT
3                    Sports

Course_Module:

CourseId (PK) ModuleId (PK)
1             1 
2             1

セッション:

SessionId (PK auto)  SessionName  ModuleId (FK)
3                    DFRER        1

学生:

StudentId (PK auto)  StudentAlias StudentForename  StudentSurname  CourseId (FK)
1                    u03824       Bill             Murphy          1
2                    u38492       Conrad           Jones           2
3                    u48383       Jane             Peters          1
4                    u34322       Morgan           Gray            2
5                    u39292       Bilal            Tuddy           3

Student_Session:

SessionId (PK)  StudentId (PK)
3               1
3               2

クエリで見つけられるようにしたいのは、現在選択された評価を受けていないが、評価を受けることができる残りのすべての学生です。

したがって、これを実行できるようにするには、次のことを行う必要があります。

  • 表を調べてSessionId、選択したセッションが何であるかを確認しますSession

  • 表を参照して、SessionId所属するモジュールを確認してください。ModuleIdSession

  • テーブルを検索して、どのコースに参加しているかを確認ModuleIdしますCourse_Module

  • テーブルの'sCourseIdと一致する学生テーブルを見て、各学生のコースを検索しますCourseIdCourse_Module

  • モジュールが含まれているコースに属するすべての学生を表示しますが、現在セッションに参加していない(つまりSession、選択したを取得しているテーブルに含まれていない)学生のみを表示しSessionIdます。

したがって、SessionId選択したものが3の場合、出力する必要のある生徒は次のようになります。

StudentId (PK auto)  StudentAlias StudentForename  StudentSurname  CourseId (FK)
3                    u48383       Jane             Peters          1
4                    u34322       Morgan           Gray            2

それの訳は:

  • SessionIdModuleId3は1に属します

  • ModuleIdCourseId1と2に属します

  • 1と2を見上げるCourseIdと、そのコースを受講している4人の学生がいます

  • ただし、これらの生徒のうち2人は、テーブルSessionIdを見るとすでに3Student_Session人を受講しているため、現在セッションを受講していない他の2人の生徒のみを表示します。

私の質問は、上記の例を達成できるようにクエリをどのように作成するのかということです。私はクエリを開始しましたが、上記の例の繰り返しに適合するように、クエリを拡張するために誰かの助けが必要です。

SELECT s.StudentId, StudentAlias, StudentForename, StudentSurname
FROM Session s 
INNER JOIN Module m ON m.ModuleId = s.ModuleId
INNER JOIN Course_Module cm ON cm.ModuleId = m.ModuleId
INNER JOIN Student s ON cm.CourseId = s.CourseId
INNER JOIN Student_Session ss ON s.StudentId = ss.StudentId
WHERE s.SessionId = 3
ORDER BY StudentAlias;

どの生徒が判読できないかを確認し、評価を受けるために判読できるが、現在評価に参加していない生徒のみを選択する方法がわかりません。

4

3 に答える 3

3
SELECT  e.*
FROM    Session a
        INNER JOIN Module b
            ON a.ModuleID = b.ModuleID
        INNER JOIN Course_Module c
            ON b.ModuleID = c.ModuleID
        INNER JOIN Course d
            ON c.CourseID = d.CourseID
        INNER JOIN Student e
            ON d.CourseID = e.CourseID
        LEFT JOIN Student_Session f
            ON f.sessionID = a.SessionID AND
                f.studentID = e.studentID
WHERE   a.SessionID = 3 AND
        f.studentID IS NULL
ORDER   BY e.STUDENTALIAS
于 2013-01-10T00:46:40.700 に答える
0
SELECT s.StudentId, StudentAlias, StudentForename, StudentSurname
FROM Session s 
INNER JOIN Module m ON m.ModuleId = s.ModuleId
INNER JOIN Course_Module cm ON cm.ModuleId = m.ModuleId
INNER JOIN Student s ON cm.CourseId = s.CourseId
LEFT OUITER JOIN Student_Session ss ON s.StudentId = ss.StudentId AND s.SessionId = 3
WHERE s.SessionId = 3
AND ss.SessionID IS NULL
ORDER BY StudentAlias;

左外側の結合を使用すると、Student_sessionに参加している人と参加していない人を見つけることができます。

于 2013-01-10T00:51:45.207 に答える
0

データからテスト データベースを作成する時間はありませんでしたが、私のコードが目標を達成するためのヒントになることを願っています。

衝動なしに INNER JOIN を使用しないでください。それらはリクエストのパフォーマンスに良くなく、不要な場所で多くの重複を生成します。

理解を深めるために、これを読む必要があるかもしれません: http://www.w3schools.com/sql/sql_join.asp

SELECT s.* FROM Student AS s 

# JOIN STUDENT SESSION
LEFT JOIN Student_Session AS ss
ON (ss.StudentId = s.StudentId AND ss.SessionId = 3)

# JOIN COURSE
LEFT JOIN Course_Module AS cm
ON s.CourseId = cm.CourseId

LEFT JOIN Session AS se 
ON (cm.ModuleId = se.ModuleId AND se.SessionId = 3)

WHERE se.SessionId IS NOT NULL
AND ss.SessionId IS NULL

ORDER BY StudentAlias;
于 2013-01-10T01:10:19.113 に答える