0

列出所有员工正在从事某些项目的部门名称。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 |

从事于

| 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 |
4

1 回答 1

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
    )
于 2012-12-06T19:09:59.673 回答