2013-01-24 7 views
2

을 기준으로 열 표시 가장 높은 급여를 가진 부서 이름을 표시하고 싶습니다. oracle sql을 사용 중이고 테이블 구조는 Dept(Deptno,Dname,Loc)Emp(Empno,Ename,Job,Salary,Deptno)입니다.하위 쿼리

Right parenthesis missing.

혼자 하위 쿼리를 실행하면 성공적으로 Deptno를 반환

는 쿼리 내가 사용이 오류를 제공

select Dname 
from Dept 
where Deptno= 
     (select Deptno 
     from Emp 
     where rownum=1 
     group by Deptno 
     order by sum(Salary) Desc 
    ); 

했다. 하지만 상위 쿼리를 사용하면 위의 오류가 발생합니다.

무엇이 문제이며 가능한 해결책은 무엇입니까?

답변

3
select dname 
    from (select dname, rank() over (order by sum(salary) desc) rnk 
      from dept d 
       inner join emp e 
         on e.deptno = d.deptno 
     group by dname, e.deptno 
     ) 
where rnk = 1; 

노트는, 당신이 한 where rownum=1 퍼팅 귀하의 예에 거대한 버그입니다. 그것은 1 임의의 행을 선택하고 그것을 정렬 (실제로 가장 높은 급여 행 .. 그냥 모든 이전 행)

두 deptartments 같은 봉급이 동일한 경우 내 솔루션은 1 행을 초과 할 수 있습니다. 원하는 경우 rank() 대신 row_number()을 사용하여 하나를 선택할 수 있습니다.