我遇到了一些问题,在一系列尝试失败之后我似乎无法弄明白。
我有三个表需要为某些报告进行联接,而在第二个表中,记录可能不存在。如果记录不存在,我需要为来自第3个表的数据报告空值。
在最基本的形式中,这里是表结构(用于调查)
Table A (Survey) ----------------------- SurveyNumber | SurveyId 016243023708 1152010 Table B (Response) ---------------------------------- SurveyId | QuestionId | ResponseId 1152010 1279235 486 Table C (Response Values) -------------------- ResponseId | Value 486 Yes
解释为什么表B中可能不存在记录只是因为在调查完成时插入了值。如果用户离开调查而未完成(他们可以稍后返回),则表B中的记录将不存在。表C中的值应报告为null。
如果它变得更容易,我需要专门针对questionid 1279235进行报告。
这是我到目前为止提出的查询(除了表b中缺少记录的问题1279235之外,它向我展示了所有内容)。
SELECT A.SurveyNumber, A.SurveyId, B.QuestionID, C.Value
FROM tblA A
LEFT JOIN tblB B
ON A.SurveyId = B.SurveyId
LEFT JOIN tblC C
ON B.ResponseId = C.ResponseId
WHERE B.QuestionId = 1279235
如果需要,我可以提供更多说明。
提前致谢
答案 0 :(得分:8)
不要将条件放在where子句中,而是放在连接部分上,因为tablec
上的记录可能不存在。
SELECT A.SurveyNumber, A.SurveyId, B.QuestionID, C.Value
FROM tblA A
LEFT JOIN tblB B
ON A.SurveyNumber = B.SurveyNumber AND
B.QuestionId = 1279235
LEFT JOIN tblC C
ON B.ResponseId = C.ResponseId
答案 1 :(得分:2)
试试这个:
SELECT
A.SurveyNumber, A.SurveyId, B.QuestionID, C.Value
FROM tblA A
LEFT JOIN tblB B ON A.SurveyId=B.SurveyId AND B.QuestionId=1279235
LEFT JOIN tblC C ON B.ResponseId=C.ResponseId
编辑工作示例:
DECLARE @tblA table (SurveyNumber varchar(12),SurveyId int)
INSERT INTO @tblA VALUES ('016243023708', 1152010)
INSERT INTO @tblA VALUES ('016243023708', 1152011)
DECLARE @tblB table (SurveyId int, QuestionId int, ResponseId int)
INSERT INTO @tblB values (1152010, 1279235, 486)
INSERT INTO @tblB values (1152011, 1279235, 487)
DECLARE @tblC table (ResponseId int, ValueOf varchar(10))
INSERT INTO @tblC values (486, 'Yes')
SELECT
A.SurveyNumber, A.SurveyId, B.QuestionID, C.ValueOf
FROM @tblA A
LEFT JOIN @tblB B ON A.SurveyId=B.SurveyId AND B.QuestionId=1279235
LEFT JOIN @tblC C ON B.ResponseId=C.ResponseId
输出:
SurveyNumber SurveyId QuestionID ValueOf
------------ ----------- ----------- ----------
016243023708 1152010 1279235 Yes
016243023708 1152011 1279235 NULL
(2 row(s) affected)