2012-04-10 76 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 2012-04-10 15:28:56

+0

好的,我嘗試使用CTE並沒有任何運氣。我能夠創建一個CTE,但它不會讓我做兩個。我仍然不知道如何以這種方式實現JOIN。我怎麼可以用表變量做到這一點? – Darren 2012-04-10 15:53:47

回答

1

中這是一個從第二失蹤1號查詢的唯一額外的資料片是

COUNT(ra.question_option_id) AS TotalAnswers 

dbo.form_response_answers ra表。

所以,只要加入這個計數到您的選擇:

(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 

,當然,將被重複多次,因爲在查詢2個行超過查詢1.

+0

這不起作用,因爲它失去了我在第一個查詢中已經存在的分組,因此計數返回不同的結果。 – Darren 2012-04-10 15:41:11

+0

這實際上是可取的,因爲我將使用該列來計算特定響應被選擇次數的百分比。 – Darren 2012-04-10 19:47:33

0

林不是專家,但不會:

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 

完成工作?