【问题标题】:Select null on a join where a record doesn't exist in another table在另一个表中不存在记录的连接上选择 null
【发布时间】:2012-11-21 13:44:45
【问题描述】:

我遇到了一个问题,经过多次失败尝试后我似乎无法解决。

我需要对三个表进行连接以进行某些报告,而在第二个表中可能不存在记录。如果记录不存在,我需要为来自第三张表的数据报告一个空值。

这是最基本的表格结构(用于调查)

表 A(调查) ---------------------- 调查编号 |调查 ID 016243023708 1152010 表 B(响应) ---------------------------------- 调查 ID |问题 ID |响应 ID 1152010 1279235 486 表 C(响应值) -------------------- 响应 ID |价值 486 是的

解释为什么表 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

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

提前致谢

【问题讨论】:

  • 当您在 where 子句中对外部表添加过滤器时,您已将外部联接变为内部联接。过滤外部表的正确方法是使过滤条件成为联接的一部分,而不是位置。我认为这两个答案都正确。

标签: sql sql-server join


【解决方案1】:

不要将条件放在 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

【讨论】:

    【解决方案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 
    

    EDIT 工作示例:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      相关资源
      最近更新 更多