列出所有员工正在处理某些项目的部门名称

时间:2012-12-06 18:26:49

标签: sql oracle11g

列出所有员工正在处理某些项目的部门名称。 Namly,没有员工做的是完整的问题。我很难得到这个答案的实际答案,而我的教授无助于告诉我我做错了什么。我的代码是

select dname
from division d, employee e, workon w
where e.did = d.did
and w.empid = e.empid
and not exists
(select empid
from workon
group by empid
having count (empid) >= all(select e.empid
from employee ee
where e.did = ee.did
group by ee.empid))
group by dname

我的表格是

员工

| EMPID |  NAME | SALARY | DID |
--------------------------------
|     1 | kevin |  32000 |   2 |
|     2 |  joan |  46200 |   1 |
|     3 | brian |  37000 |   3 |
|     4 | larry |  82000 |   5 |
|     5 | harry |  92000 |   4 |
|     6 | peter |  45000 |   2 |
|     7 | peter |  68000 |   3 |
|     8 | smith |  39000 |   4 |
|     9 |  chen |  71000 |   1 |
|    10 |   kim |  46000 |   5 |

| DID |                    DNAME | MANAGERID |
----------------------------------------------
|   1 |              engineering |         2 |
|   2 |                marketing |         1 |
|   3 |           human resource |         3 |
|   4 | Research and development |         5 |
|   5 |               accounting |         4 |

Workon

| PID | EMPID | HOURS |
-----------------------
|   3 |     1 |    30 |
|   2 |     3 |    40 |
|   5 |     4 |    30 |
|   6 |     6 |    60 |
|   4 |     3 |    70 |
|   2 |     4 |    45 |
|   5 |     3 |    90 |
|   3 |     3 |   100 |
|   6 |     8 |    30 |
|   4 |     4 |    30 |
|   5 |     8 |    30 |
|   6 |     7 |    30 |
|   6 |     9 |    40 |
|   5 |     9 |    50 |
|   4 |     6 |    45 |
|   2 |     7 |    30 |
|   2 |     8 |    30 |
|   2 |     9 |    30 |
|   1 |     9 |    30 |
|   1 |     8 |    30 |
|   1 |     7 |    30 |
|   1 |     5 |    30 |
|   1 |     6 |    30 |
|   2 |     6 |    30 |

1 个答案:

答案 0 :(得分:2)

你非常接近。你要做的是被称为“相关子查询”。您将要查询的表中的密钥与查询中的密钥相关联,该查询对候选集没有贡献,但在where子句中充当过滤器。

代码中用于演示此内容的关键行是NOT EXISTS子句中的行:

e.did = ee.did

不要通过比较聚合COUNT(...)结果来尝试这样做,而是在Employee和Workon表之间进行外部联接,以查明是否有任何员工没有做任何事情,然后找到基于部门的部门对那些不存在特定部门的员工。

这是一个使用Oracle标准HR示例教程表的示例查询,表示与此处相同的连接条件。无论您在哪里运行查询,您都可以访问这些表,因此在这里可能对答案感兴趣的其他人也可以访问这些表,因此他们可以运行查询而无需构建表来解决问题。将查询转换为表格是一件相对简单的事情,所以我会把这个练习留给你! :)

下面我的查询中的最终大写行是连接条件,使得此查询成为相关子查询,就像您在自己的查询中所做的那样。

select
    *
from
    hr.departments d
where
    not exists
    (
        select
             ee.employee_id
            ,ee.first_name
            ,ee.last_name
            ,dd.department_id
            ,dd.department_name
            ,jj.job_id
        from
             hr.employees   ee
            ,hr.departments dd
            ,hr.job_history jj
        where
                ee.department_id = dd.department_id
            and ee.employee_id   = jj.employee_id   (+)
            and jj.job_id is null

            AND D.DEPARTMENT_ID = DD.DEPARTMENT_ID
    )