2012-12-06 2 views
0

모든 직원이 일부 프로젝트에서 작업하는 부서 이름을 나열하십시오. 즉, 완전한 질문을하는 직원이 없습니다. 이 문제에 대한 실제 답변을 얻는 데 어려움을 겪고 있습니다. 교수님은 내가 뭘 잘못하고 있는지 말해 주는데 도움이되지 않습니다. 내가 가진 코드는모든 직원이 일부 프로젝트에서 작업하는 부서 이름을 나열하십시오.

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 

표입니다 I이 있습니다

직원

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

답변

2

당신은 매우 가깝습니다. 당신이하려고하는 것은 "상관 하위 쿼리"라고합니다. 쿼리하는 테이블의 키를 후보 집합에 포함되지 않지만 where 절의 필터 역할을하는 쿼리의 키와 관련시킵니다.

e.did = ee.did 

대신 집계 COUNT (...) 결과를 비교하여이 작업을 수행하기 위해 노력하는,을 수행

이가하지의 라인을 보여 코드의 핵심 라인은 말한다 EXISTS 절 Employee 테이블과 Workon 테이블 사이의 외부 조인을 수행하여 아무 것도하지 않는 직원이 있는지 알아 낸 다음 지정된 부서에없는 직원을 기준으로 부서를 찾습니다.

다음은 여기에있는 것과 동일한 조인 조건을 나타내는 Oracle 표준 HR 예제 자습서 테이블을 사용하는 쿼리 예입니다. 쿼리를 실행할 때마다이 테이블에 액세스 할 수 있으므로 응답에 관심이있는 다른 사용자도 테이블에 액세스하지 않고도 쿼리를 실행할 수 있습니다. 쿼리를 테이블로 변환하는 것은 비교적 사소한 일이므로, 나는 그 연습을 여러분에게 맡길 것입니다! :)

내 쿼리에서 마지막으로 대문자로 표시된 줄은이 쿼리를 상관 관계가있는 하위 쿼리로 만드는 조인 조건입니다. e.did = d.did 하지가 존재 이 (workon 에서 EMPID 을 선택 "부서 이름"분할 D에서 , 직원 전자로 나는 별개의 (DNAME)을 선택 '도착 것과

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 
    ) 
+0

) '하지만 내 교수는 말한다 e.did 에 (e.did는 = ee.did가와 이 (workon의 w에서 w.empid 선택)하지 ee.empid 의 경우 직원 EE 에서 e.did 를 선택) 내 대답의 상관 관계가 잘못되었습니다 – user1824931

+0

그는 맞습니다; 당신의 대답은 틀립니다. ee.empid가 아니라고 (workon w에서 w.empid를 선택하십시오) 말할 때, 당신은 아무것도하지 않고 일하는 사람들을 찾고 있다고 말하는 것입니다. 그러나, 그것은 당신에게 무언가에 종사하고있는 사람들을 얻지는 못하지만, 현재 당신이 고려하고있는 부서에서는 그렇지 않습니다. 테이블 ee의 부서를이 필터링 부속 조회에 연결해야합니다. – Lluluien

관련 문제