2012-05-04 3 views
2

학생을 워크샵에 등록 할 수있는 데이터베이스를 만들고 StudentID 및 WorkshopID를 유지하는 WorkshopRegistration 테이블이 있습니다. 내 목표는 StudentName, SchoolName, Workshop1, Workshop2 열이있는 테이블을 반환하는 것입니다. 학생들은 두 번 이상의 워크샵에 등록하지 않습니다. 1 열짜리 워크샵을 기꺼이 받아 들였지만 두 번째 워크샵을 만드는 데 문제가 있습니다.원본의 열로 하위 쿼리에 의해 반환 된 행 얻기

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

이전 솔루션은 학생이 한 번의 워크샵에만 참석할 때 워크샵 이름을 복제합니다. 대신 제안 할 것입니다 :

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 문은 하나의 워크샵 만있는 상황을 처리합니다. 두 번째 조인을 "LEFT OUTER JOIN"으로 변경하면 워크샵이없는 경우에도 동일한 쿼리가 작동합니다. 2 개 이상의 워크샵을 처리합니다. . . 그게 또 다른 질문이 될 것입니다.

+0

위의 두 가지 모두 내 요구 사항에 맞지만 이전 쿼리의 제한 사항에 대해서는 정확합니다. 답변 주셔서 감사합니다! – panahi

1

나는이 한 학생은 동시에 두 개의 워크샵에 등록 할 수 있습니다로 작동합니다 약간 쿼리를 변경할 것입니다 :

가 작동 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

관련 문제