【问题标题】:WHERE clause on SQL JOINSQL JOIN 上的 WHERE 子句
【发布时间】:2016-02-04 09:33:59
【问题描述】:

我有以下查询来返回客户使用的工作(访问)数量以及他/她使用的不同兽医。

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 子句?

【问题讨论】:

  • srickt01 给出了正确答案。在外连接记录中,列为空,因此将列 Status=<>!= 进行比较将永远不会为真,因此您的外连接记录将被删除,您就在原处一个内部连接。我想补充一点,NOT IN 的几个AND != 更易读:visit.Status NOT IN ('Cancelled', 'ReScheduled')
  • 同意NOT IN

标签: mysql sql join


【解决方案1】:

您不想要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

【讨论】:

    【解决方案2】:

    当我们添加带有left outer join 的where 子句时,它的行为类似于inner join,其中在ON 子句之后应用过滤器。将where 替换为AND 子句后尝试

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多