以下是我的数据库结构(用于从调查中收集信息):
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
会占据这个记录,但显然不是。
非常感谢任何帮助。
答案 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