左连接不返回null的记录

时间:2014-03-07 17:35:22

标签: sql join null

以下是我的数据库结构(用于从调查中收集信息):

question_responses->answer_choices->subquestions->questions->survey
    |                                                         ^
    V                                                         |
submissions->response_group<----------------------------survey_deployment

其中A-> B表示A具有B的PK

所以,我想获得特定用户的回复;让我们说他的提交pk是1.我写了查询

select  question_responses.answer_text
from    submissions      join question_responses on (question_responses.submission_pk = submission.pk)
                         join answer_choices     on (question_responses.answer_choices_pk = answer_choices.pk)
                         join subquestions       on (answer_choices.subquestions_pk = subquestions.pk)
                   right join questions          on (subquestions.questions_pk = questions.pk)
where       submissions.pk = 1
order by    questions.order

有可能不回答问题。在这种情况下,没有记录question_response.pk。我仍然希望能够考虑跳过,所以我需要返回此记录,即使没有回复。我认为right join会占据这个记录,但显然不是。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

因为在where子句中有submissions.pk = 1,所以这会有效地将您的外连接转换为内连接,因为任何丢失的提交都将具有空的pk。并且null = 1不是真的。

您可以使用LEFT JOIN重写您的查询,并从问题中选择:

select  question_responses.answer_text
from    questions
        left join (subquestions
            inner join answer_choices
                on answer_choices.subquestions_pk = subquestions.pk
            inner join question_responses
                on question_responses.answer_choices_pk = answer_choices.pk
            inner join submissions
                on question_responses.submission_pk = submission.pk)
            on subquestions.questions_pk = questions.pk
            and submissions.pk = 1
order by    questions.order;

这类似于:

select  subquery.answer_text
from    questions
        left join 
        (   select question_responses.answer_text, subquestions.questions_pk
            from subquestions
                inner join answer_choices
                    on answer_choices.subquestions_pk = subquestions.pk
                inner join question_responses
                    on question_responses.answer_choices_pk = answer_choices.pk
                inner join submissions
                    on question_responses.submission_pk = submission.pk
                where submissions.pk = 1
        ) subquery
            on subquery.questions_pk = questions.pk
order by    questions.order;

但是根据你的dbms,前者可能表现得更好,因为它没有派生表。

答案 1 :(得分:0)

看看这个,它有帮助吗?

SELECT  question_responses.answer_text
FROM    questions LEFT JOIN subquestions on (subquestions.questions_pk = questions.pk)
                  LEFT JOIN answer_choices on (answer_choices.subquestions_pk = subquestions.pk)
                  LEFT JOIN question_responses on (question_responses.answer_choices_pk = answer_choices.pk)
                  LEFT JOIN submissions on (question_responses.submission_pk = submission.pk)
WHERE submissions.pk = 1
ORDER BY  questions.order