2012-04-10 1 views
0

두 개의 비교적 복잡한 쿼리를 하나의 결과 집합으로 결합하려고합니다.두 개의 복잡한 SQL 쿼리에서 OUTER JOIN을 수행하는 방법은 무엇입니까?

결과 세트 1 :

SELECT sq.question_id,  
    COUNT(ra.question_option_id) AS TotalAnswers 

FROM dbo.survey_question sq 
    LEFT OUTER JOIN dbo.question_option qo 
     ON sq.question_id = qo.question_id 
    LEFT OUTER JOIN dbo.form_response_answers ra 
     ON qo.question_option_id = ra.question_option_id 
GROUP BY sq.question_id 

결과 세트 2 :

SELECT p.program_id, 
    p.pre_survey_form_id, 
    p.post_survey_form_id, 
    fq.form_id, 
    sq.question_id, 
    sq.question_text, 
    qo.question_option_id, 
    qo.option_text, 
    G.Total 

FROM dbo.program p 
    LEFT OUTER JOIN dbo.form_question fq 
     ON p.pre_survey_form_id = fq.form_id OR p.post_survey_form_id = fq.form_id 
    LEFT OUTER JOIN dbo.survey_question sq 
     ON fq.question_id = sq.question_id 
    LEFT OUTER JOIN dbo.question_option qo 
     ON sq.question_id = qo.question_id 
    LEFT OUTER JOIN (
     SELECT ra.question_id, ra.question_option_id, COUNT(*) AS Total 
     FROM dbo.form_response_answers ra 
     GROUP BY ra.question_option_id, ra.question_id 
    ) G 
     ON G.question_id = sq.question_id AND G.question_option_id = qo.question_option_id 

ORDER BY p.program_id, fq.form_id, sq.question_id, qo.question_option_id 

나는 행 question_id 경기에 그들과 합류해야합니다. 도와주세요.

+0

CTE 또는 테이블 변수를 사용해 보셨습니까? – Romhein

+0

좋아요, CTE를 사용해 보았는데 행운이 없었습니다. 하나의 CTE를 만들 수 있었지만 두 가지를 할 수는 없었습니다. 나는 아직도 이런 식으로 JOIN을 구현하는 방법을 몰랐다. 테이블 변수로 어떻게하면 될까요? – Darren

답변

1

두 번째에서 실종 1 쿼리의 정보 만 추가 부분은 dbo.form_response_answers ra 테이블에

COUNT(ra.question_option_id) AS TotalAnswers 

입니다.

그래서, 당신의 선택에이 카운트를 추가

(select count(*) from dbo.form_response_answers ra 
     where qo.question_option_id = ra.question_option_id) as AS TotalAnswers 

같이 :

SELECT p.program_id, 
     p.pre_survey_form_id, 
     p.post_survey_form_id, 
     fq.form_id, 
     sq.question_id, 
     sq.question_text, 
     qo.question_option_id, 
     qo.option_text, 
     G.Total, 
     (select count(*) from dbo.form_response_answers ra 
     where qo.question_option_id = ra.question_option_id) as AS TotalAnswers 


FROM dbo.program p 
    LEFT OUTER JOIN dbo.form_question fq 
    ON p.pre_survey_form_id = fq.form_id OR p.post_survey_form_id = fq.form_id 
LEFT OUTER JOIN dbo.survey_question sq 
    ON fq.question_id = sq.question_id 
LEFT OUTER JOIN dbo.question_option qo 
    ON sq.question_id = qo.question_id 
LEFT OUTER JOIN (
    SELECT ra.question_id, ra.question_option_id, COUNT(*) AS Total 
    FROM dbo.form_response_answers ra 
    GROUP BY ra.question_option_id, ra.question_id 
) G 
    ON G.question_id = sq.question_id AND G.question_option_id = qo.question_option_id 

ORDER BY p.program_id, fq.form_id, sq.question_id, qo.question_option_id 

편집 : 각 sq.question_id에 대한 답변의 총 #을 원했다.

그래서 나는 삽입해야 :

(select count(ra2.question_option_id) 
    from dbo.question_option qo2 
    LEFT OUTER JOIN dbo.form_response_answers ra2 
     ON qo2.question_option_id = ra2.question_option_id 
    where qo2.question_id = sq.question_id) as TotalAnswers 

지금은 물론, 여러 번 반복 될 것이다 늘 쿼리 1.

+0

첫 번째 쿼리에서 그룹화가 손실되어 카운트가 다른 결과를 반환하기 때문에 이것이 작동하지 않습니다. – Darren

+0

특정 응답을 선택한 횟수의 백분율을 계산할 때 해당 열을 사용할 것이므로 실제로 반복하는 것이 바람직합니다. – Darren

0

임 전문가는 그러나 이상의 쿼리 2 개 행이 있기 때문에 : 다음

SELECT sq.question_id,  
    COUNT(ra.question_option_id) AS TotalAnswers INTO [#temp_table1] 
... 

SELECT p.program_id, 
    p.pre_survey_form_id, 
    p.post_survey_form_id, 
    fq.form_id, 
    sq.question_id, 
    sq.question_text, 
    qo.question_option_id, 
    qo.option_text, 
    G.Total 
INTO [#temp_table2] 
... 

:

SELECT * FROM [#temp_table1] JOIN ON [#temp_table1].question_id = [#temp_table2].question_id 

작업 완료?