2012-05-04 8 views
2

生徒がワークショップに登録できるデータベースを作成しています。私はStudentIDとWorkshopIDを保持するWorkshopRegistrationテーブルを持っています。私の目標は、列StudentName、SchoolName、Workshop1、Workshop2のテーブルを返すことです。学生は2回以上のワークショップに参加することはありません。私は1つのワークショップをコラムとして持つようになったが、2番目のワークショップを手に入れるのは難しい。元の列としてサブクエリによって返された行の取得

SELECT Students.StudentID, Students.name, Schools.name, 
     (SELECT Workshops.title 
     FROM Workshops 
     WHERE Workshops.WorkshopID IN 
       (SELECT WorkshopID 
       FROM WorkshopRegistration 
       WHERE WorkshopRegistration.StudentID=Students.StudentID)) as Workshop1, 
     (SELECT Workshops.title 
     FROM Workshops 
     WHERE Workshops.WorkshopID IN 
       (SELECT WorkshopID 
       FROM WorkshopRegistration 
       WHERE WorkshopRegistration.StudentID=Students.StudentID)) as Workshop2 
FROM Students, Schools 
WHERE Students.SchoolID=Schools.SchoolID; 

答えて

1

以前のソリューションでは、学生が1つのワークショップにのみ出席したときに、ワークショップ名を複製します。代わりに次のように提案します:

SELECT students.studentid, 
     students.name, 
     schools.name, 
     mintitle AS Workshop1, 
     (CASE 
      WHEN mintitle = maxtitle THEN NULL 
      ELSE maxtitle 
     END) AS Workshop2 
FROM students 
     JOIN school 
     ON students.schoolid = schools.schoolid 
     JOIN (SELECT studentid, 
        Min(title) AS minTitle, 
        Max(title) AS maxTitle 
      FROM workshop w 
        JOIN workshopregistration wr 
         ON w.workshopid = wr.workshopid 
      GROUP BY studentid) w 
     ON w.studentid = stuents.studentid 

ケースステートメントは、ワークショップが1つしかない状況を処理します。 「LEFT OUTER JOIN」に2番目の結合を変更することによって、ワークショップがない場合でも同じクエリが機能することに注意してください。 3つ以上のワークショップを扱う。 。 。まあ、別の質問があります。

+0

これらの両方が私のニーズに合っていますが、前のクエリの制限については正しいです。あなたの答えをありがとう! – panahi

1

私はこれがある限り、学生のみ同時に2回のワークショップのために登録することができますように動作しますが、少しあなたのクエリを変更します

作業DEMO

SELECT t.StudentID 
    , t.name as StudentName 
    , s.name as SchoolName 
    , ws1.Title as Workshop1 
    , ws2.Title as Workshop2 
FROM Students t 
LEFT JOIN Schools s 
    on t.SchoolID = s.SchoolID 
LEFT JOIN 
(
    SELECT max(WorkshopID) as WorkshopID, StudentId 
    FROM WorkshopRegistration 
    GROUP BY studentid 
) w1 
    ON t.StudentID = w1.StudentID 
LEFT JOIN 
(
    SELECT min(WorkshopID) as WorkshopID, StudentId 
    FROM WorkshopRegistration 
    GROUP BY studentid 
) w2 
    ON t.StudentID = w2.StudentID 
LEFT JOIN workshops ws1 
    ON w1.workshopid = ws1.workshopid 
LEFT JOIN workshops ws2 
    ON w2.workshopid = ws2.workshopid 
ORDER BY t.StudentID 
でこれ SQL Fiddleを参照してください。

結果:

enter image description here

+0

これは、私が欲しいものを達成するために非常にうまく機能します。私は単純なクエリを利用しているだけでなく、あなたが私に見せてくれたSQLFiddleツールを使ってジョインするのは初めてです。どうもありがとうございました。 – panahi

+0

あなたが新規に参加した人には参考文献として使用できる素晴らしい記事があります。http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.htmlブックマークしました。 :) – Taryn

関連する問題