2012-04-10 7 views
0

Ich habe zwei relativ komplexe Abfragen, die ich versuche, zu einer Ergebnismenge zusammenzufügen.Wie führt man einen OUTER JOIN bei zwei komplexen SQL-Abfragen aus?

Ergebnis gesetzt 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 

Ergebnis Set 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 

Ich brauche sie auf die Zeilen, in denen question_id Spiele zu verbinden. Bitte helfen Sie.

+0

Haben Sie versucht, ein CTE oder eine Tabellenvariable zu verwenden? – Romhein

+0

Ok, ich habe versucht mit einem CTE und hatte kein Glück. Ich war in der Lage, ein CTE zu erstellen, aber es ließ mich nicht zwei machen. Ich wusste immer noch nicht, wie ich das JOIN auf diese Weise implementieren sollte. Wie kann ich das mit Tabellenvariablen machen? – Darren

Antwort

1

Die einzige zusätzliche Information in der ersten Abfrage, die von den zweiten fehlt, ist

COUNT(ra.question_option_id) AS TotalAnswers 

auf dem dbo.form_response_answers ra Tisch.

So fügen Sie einfach diese Zählung in Ihr wählen:

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

wie in:

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 

EDIT: Sie können die Gesamtanzahl der Antworten für jeden sq.question_id wollte.

So sollte ich eingefügt haben:

(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 

Nun, natürlich, die mehrere Male wiederholt werden, weil es mehr Zeilen in Abfrage 2 als Abfrage sind 1.

+0

Das funktioniert nicht, weil es die Gruppierung verliert, die ich in der ersten Abfrage an Stelle habe und daher die Zählung andere Ergebnisse zurückgibt. – Darren

+0

Das ist eigentlich wünschenswert, dass es wiederholt wird, weil ich diese Spalte verwenden werde, um den Prozentsatz für die Anzahl von Malen zu berechnen, die eine bestimmte Antwort gewählt wurde. – Darren

0

Im kein Experte, aber wont :

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] 
... 

dann:

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

die Arbeit erledigen?