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

5hcedyr0  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(272)

在具有以下架构定义的表employees和凭单之间具有一对多关系:

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来促进您的协作。
谢谢你的时间

cu6pst1q

cu6pst1q1#

你可以这样做 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
                 )
voj3qocg

voj3qocg2#

使用 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

这是小提琴

weylhg0b

weylhg0b3#

可以使用左或右外部联接,例如:

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

基本上你要找的就是这套

相关问题