获取在特定日期没有凭证的所有员工

时间:2018-01-03 22:30:08

标签: mysql sql

表雇员和代金券之间具有一对多关系,具有以下架构定义:

employees
    - id
    - full_name

vouchers
    - id
    - employee_id
    - date

我需要让所有在特定日期没有优惠券的员工。

现在我在后端代码中所做的事情首先是获取所有员工列表,然后是所有拥有特定日期凭证的员工。最后减去两个员工名单。通过这种方式,我得到了两个员工名单之间的差异。

这是我在grails框架中使用的逻辑

private List<Employee> getEmployeeListInDate(final Date date) {
    List<Employee> employeeList = employeeService.list()
    List<Employee> employeeListInDate = employeeService.listInDate(date)

    employeeList - employeeListInDate
}

这很有效。但是我想知道如何使用sql查询实现这个逻辑?我创建了一个sqlfiddle来促进您的协作。

感谢您的时间

3 个答案:

答案 0 :(得分:3)

使用not exists效果很好。为了完整起见,我还提到您也可以使用外连接,如下所示:

select 
  e.*
from 
  employees e
  left outer join vouchers v
    on (e.id=v.employee_id and v.date = {date here})
where
  v.id is null

Here is the fiddle

答案 1 :(得分:2)

您可以使用not exists执行此操作。

select * 
from employees e
where not exists (select 1 from vouchers v where v.employee_id=e.id 
                  and v.date = --put a date in here
                 )

答案 2 :(得分:-1)

您可以使用左或右外连接,例如:

select * from employees
left join vouchers on employees.id=vouchers.emp_id and date='2017-10-11'
where vouchers.id is null

基本上你要找的是这套

LEFT JOIN