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;
4

2 に答える 2

1

クエリを少し変更します。これは、学生が同時に2つのワークショップにしか登録できない限り機能します。

動作中のデモでこのSQLフィドルを参照してください

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

結果:

ここに画像の説明を入力してください

于 2012-05-04T21:47:26.447 に答える
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 

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

于 2012-05-05T04:15:45.403 に答える