在另一个表中不存在记录的连接上选择null

时间:2012-11-21 13:44:46

标签: sql sql-server join

我遇到了一些问题,在一系列尝试失败之后我似乎无法弄明白。

我有三个表需要为某些报告进行联接,而在第二个表中,记录可能不存在。如果记录不存在,我需要为来自第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

如果需要,我可以提供更多说明。

提前致谢

2 个答案:

答案 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)