如何创建一个查询来比较两个额外查询的两个确切结果?

时间:2015-07-14 16:28:07

标签: sql oracle

我正在创建一个数据模型来注册一个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

任何帮助都表示赞赏。 谢谢!

2 个答案:

答案 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拼写错误,我没有机会在数据库中查看此查询)

相关问题