2012-11-21 97 views
3

我有一个问题,我似乎无法在一连串失败的尝试后找出问题。在另一个表中不存在记录的连接上选择null

我有三张表,我需要做一些报告加入,并在第二个表中可能不存在记录。如果记录不存在,我需要为来自第三个表的数据报告空值。

在最基本的形式,这里是表结构(这是一个调查)

 
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.

这是查询我拿出迄今报告(它显示我的一切,但调查与丢失记录在问题1279235的表b中)。

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

当你把一个过滤器上的外部表在哪里子句,你已经变成了t他外部连接成一个内部连接。过滤外部表的正确方法是将过滤条件设置为连接的一部分,而不是位置。我认为这两个答案都能正确做到。 –

回答

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 

OUTPUT:

SurveyNumber SurveyId QuestionID ValueOf 
------------ ----------- ----------- ---------- 
016243023708 1152010  1279235  Yes 
016243023708 1152011  1279235  NULL 

(2 row(s) affected) 
+0

谢谢,这正是我需要的。 – jsmith

6

不要把条件在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 
相关问题