表雇员和代金券之间具有一对多关系,具有以下架构定义:
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来促进您的协作。
感谢您的时间
答案 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
答案 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)