2012-02-07 83 views
2

这是使用堆栈溢出我的第一次,所以我希望我要求在正确的道路这个问题。SQL查询 - 添加NULL结果SELECT查询

我有2个,我想比较和识别遗漏值SQL查询,虽然我无法加入在为NULL进入第二个查询,以确定缺少的信息的字段。我将列出查询,然后解释我在找什么。

查询#1

SELECT C.CustomerId, C.CustomerName, C.StatusId 
FROM Customer C 
WHERE C.StatusId = 1 
ORDER BY C.CustomerName 

查询#2

SELECT C.CustomerId, C.CustomerName, C.StatusId, I.AuthorityId 
FROM Customer C 
    JOIN Identifier I ON I.CustomerId = C.CustomerId 
WHERE C.StatusId = 1 
    AND I.AuthorityId = 11 
ORDER BY C.CustomerName 

第一个查询给我说是在我们的系统中活动的客户名单。第二个查询为我提供了一个活动客户列表,其中AuthorityId = 11。

从我的活动客户列表(结果来自查询#1),有几个客户没有显示在结果中从我的第二个查询,因为他们在AuthorityId = 11的标识符表中没有记录。我想生成一个列表,显示所有活动客户以及AuthorityId列中的数据,但是如果活动客户没有在AuthorityId = 11的标识符表中记录,我希望它声明为NULL,以便我可以清除丢失的数据。

我希望这是清楚的是我期待的。

在此先感谢您的帮助!

回答

1

只是改变JOINLEFT JOIN

SELECT C.CustomerId, C.CustomerName, C.StatusId, I.AuthorityId 
FROM Customer C 
    LEFT JOIN Identifier I ON I.CustomerId = C.CustomerId 
WHERE C.StatusId = 1 
    AND I.AuthorityId = 11 
ORDER BY C.CustomerName 

UPDATE要替换,如果你想改变(NULL)价值为NULL

或什么的话,你可以在你COALESCE

SELECT C.CustomerId, C.CustomerName, C.StatusId, COALESCE(I.AuthorityId, 'whatever') 
FROM Customer C 
    LEFT JOIN Identifier I ON I.CustomerId = C.CustomerId 
WHERE C.StatusId = 1 
    AND I.AuthorityId = 11 
ORDER BY C.CustomerName 
+1

是不是你留下参加由“AND AuthorityId = 11”取消了呢?结果集不包含标识符中没有记录的任何客户,这需要包含在联合声明中,或者使用ISNULL或类似方法进行核算。 – GarethD 2012-02-07 16:19:47

2

尝试:

SELECT C.CustomerId, C.CustomerName, C.StatusId, I.AuthorityId 
FROM Customer C 
LEFT JOIN Identifier I ON I.CustomerId = C.CustomerId and I.AuthorityId = 11 
WHERE C.StatusId = 1 
ORDER BY C.CustomerName 
+0

谢谢!虽然这些答案都是相似的,但我使用了这个答案,并且工作得很完美。感谢您的快速回复! – Brandon 2012-02-07 20:41:19

0
SELECT C.CustomerId, C.CustomerName, C.StatusId, I.AuthorityId 
FROM Customer C 
    LEFT OUTER JOIN Identifier I ON 
    (I.CustomerId = C.CustomerId) 
    AND (I.AuthorityId = 11) 
WHERE (C.StatusId = 1) 
ORDER BY C.CustomerName 

左外连接或左联接是你想要的这里。

+0

这将返回C.StatusID <> 1的客户,因为您在左外连接中包括此项! – GarethD 2012-02-07 16:15:31