我正在创建一个数据模型来注册一个EMPLOYEE能够根据其完成的COURSES列表(COURSE_ID)执行的SERVICES。为此,我有两个数据表:EMPLOYEES和SERVICES。我有两张地图表:一张表与EMPLOYEE完成的课程相关,另一张表与服务所需的课程相关。
数据表如下所示:
EMPLOYEES:
EMP_ID NAME
=============
1 Joe
2 Bob
3 Rob
SERVICES:
SERV_ID SERVICE
====================
1 Install
2 Configure
3 Manage
关系或地图表如下所示:
EMPLOYEE_COURSES
EMP_ID COURSE_ID
==================
1 3
1 5
1 6
2 5
3 4
SERVICE_COURSES
SERV_ID COURSE_ID
==================
1 3
1 5
1 6
2 3
3 4
我想要生成的查询结果应该是这样的,其中只显示了服务1和3,因为只有两个EMPLOYEES具有SERVICE所需的课程:
SERV_ID EMP_ID SERVICE NAME
================================
1 1 Install Joe
2 1 Configure Joe
3 3 Manage Rob
任何帮助都表示赞赏。 谢谢!
答案 0 :(得分:0)
select e.emp_id,e.name,s.serv_id,s.service
from employees e
join employee_courses ec on e.emp_id = ec.emp_id
join service_courses sc on sc.course_id = ec.course_id
join services s on s.serv_id = sc.serv_id
JOIN条件会为您提供所需的结果。
答案 1 :(得分:0)
如果我正确理解您的问题,您可以使用以下内容:
select distinct s.serv_id, e.EMP_ID, s.service, e.name
from EMPLOYEES e
join EMPLOYEE_COURSES ec on ec.EMP_ID = e.EMP_ID
join SERVICE_COURSES sc on sc.COURSE_ID = ec.COURSE_ID
join SERVICES s on s.SERV_ID = sc.SERV_ID
where
not exists (select *
from SERVICE_COURSES sc1
left join EMPLOYEE_COURSES ec1
on sc1.COURSE_ID = ec1.COURSE_ID
and ec1.EMP_ID = e.EMP_ID
where s.SERV_ID = sc1.SERV_ID
and ec1.EMP_ID is null)
在这里,我们选择不同的员工 - 服务对(通过加入4个表)
对于serv_id = 1,emp_id = 1,需要避免3条记录(可以使用“group by”代替)。
然后筛选出不符合标准的员工
我们只需要拥有相应服务所有课程的员工
换句话说,我们只需要没有记录的雇员
service_courses没有相应的employee_courses记录(所以没有错过service_course)
这可以通过不同的方式完成
例如,通过将此员工的EMPLOYEE_COURSES外部加入此服务的所有service_courses - 如果我们发现至少有一个EMPLOYEE_COURSES记录错过,则应过滤掉该员工。
(抱歉eny拼写错误,我没有机会在数据库中查看此查询)