2016-02-04 44 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