列出所有员工正在处理某些项目的部门名称。 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 |
答案 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
)