2016-02-04 116 views
0

我有以下查询来返回客户使用的作业(访问次数)和他/她使用的独特的兽医数量。SQL上的WHERE子句JOIN

SELECT 
customer.users_id AS CustID, 
COUNT(VisitID) AS Jobs, 
COUNT(DISTINCT VetID) AS Resources 
FROM customer 
LEFT JOIN visit ON customer.users_id = visit.CustID 
GROUP BY customer.users_id 

当我添加一个WHERE子句来获得只计算那些没有改期或取消访问,我的查询看起来是这样的。

SELECT 
customer.users_id AS CustID, 
COUNT(VisitID) AS Jobs, 
COUNT(DISTINCT VetID) AS Resources 
FROM customer LEFT JOIN visit ON customer.users_id = visit.CustID 
WHERE visit.Status != 'Cancelled' AND visit.Status != 'ReScheduled' 
GROUP BY customer.users_id 

然而,在这种情况下,我只得到,虽然我使用的是左连接,为客户谁没有任何取消或重新安排访问,埃本的客户。

我该如何适应WHERE子句?

+0

strickt01给予了正确的答案后再试。在外连接记录中,列是空的,因此比较列'Status'与'=','<>'或'!='永远不会是真的,因此您的外连接记录将被删除,是内连接。我想补充一点,'AND!='在'NOT IN'中更具可读性:'visit.Status NOT IN('Canceled','ReScheduled')'。 –

+0

同意重做'NOT IN' – strickt01

回答

5

你不想要WHERE条款。这只是将LEFT JOIN变成INNER JOIN。您在LEFT JOIN需要一个AND

SELECT customer.users_id AS CustID, COUNT(VisitID) AS Jobs, COUNT(DISTINCT  VetID) AS Resources 
FROM customer 
LEFT JOIN visit ON customer.users_id = visit.CustID 
AND visit.Status NOT IN('Cancelled','ReScheduled') 
GROUP BY customer.users_id 
+0

非常感谢! :) –

1

当我们添加一个where子句与left outer join,它像一个inner join,其中ON子句后应用的过滤器。与AND条款取代where

SELECT customer.users_id AS CustID, COUNT(VisitID) AS Jobs, COUNT(DISTINCT VetID) AS Resources 
FROM customer 
LEFT outer JOIN visit 
ON (customer.users_id = visit.CustID) 
AND visit.Status != 'Cancelled' 
AND visit.Status != 'ReScheduled' 
GROUP BY customer.users_id