根据两个字段查找一个表中缺少的值,而另一个表中存在该值

时间:2019-08-06 02:49:40

标签: mysql sql

我已经为此苦苦挣扎了几个小时。

我有两个表:第一个表具有出勤记录,其中包含行ID,客户ID,服务日期和从0到16的单位数。第二个表中的客户响应具有行ID,客户ID,服务日期和许多其他领域。

这里的问题是:如何查找第二个表上缺少的客户,这些客户在特定日期的第一个表上的单位数超过0?请注意,唯一的唯一字段是行ID。

几个小时后,我想到了这种方法,但是由于某种原因,它返回的日期范围大于20天的结果集为空:

SELECT `caseload`.* FROM `caseload` WHERE `caseload`.`client_id` NOT IN
(
    SELECT  `caseload`.`client_id` FROM `caseload`
    JOIN    `form_psr`
    ON      `caseload`.`client_id` = `form_psr`.`client_id`
    AND     `caseload`.`date` = `form_psr`.`service_date`
    WHERE   `caseload`.`date` >= '2019-07-01' AND `caseload`.`date` <= '2019-07-31'
)
HAVING `date` >= '2019-07-01' AND `date` <= '2019-07-31'
AND `units` > 0

此sqlfiddle具有一些示例数据:http://sqlfiddle.com/#!9/0a4be2/49

谢谢!

3 个答案:

答案 0 :(得分:2)

您好,您可以使用左联接来确定大小写情况下但不在form_psr中的用户,并使用一个子句来过滤日期和单位数。

    select
       * 
    from
       caseload as c 
       left join
          form_psr as fp 
          on c.client_id = fp.client_id 
    where
       fp.client_id is null 
       and
       c.units > 0 
       and 
       c.service_date between '2019-07-01' AND  '2019-07-31'

答案 1 :(得分:1)

使用not exists

select cl.*
from caseload c 
where c.units <= 16 and
      c.service_date >= '2019-07-01' and
      c.service_date <  '2019-08-01' and
      not exists (select 1
                  from form_psr as fp 
                  where c.client_id = fp.client_id 
                 );

请注意,我还更改了日期比较。此版本适用于日期和日期/时间值。通常,between可能具有日期/时间值的意外行为,因此,我建议使用这种明确的构造。

我还假设单位数量永远不会为负。

答案 2 :(得分:0)

使用Gordon的解决方案,我仅需进行几次修改就可以解决我的问题。我接受了他的解决方案,但我只是在发布最终要澄清的内容。这是最终的查询:

select *
from caseload c 
where c.units > 0 and
      c.service_date >= '2019-07-01' and
      c.service_date <= '2019-08-01' and
      not exists (select 1
                  from form_psr as fp 
                  where c.client_id = fp.client_id 
                  and c.service_date = fp.service_date
                 );