2014-04-12 1 views
0

나는SQLPLUS 단일 행 부질의 반환보다 하나의 행보다

SELECT last_name, department_id, salary 
FROM employees 
WHERE salary >(SELECT AVG(salary) 
       FROM employees 
       GROUP BY department_id) 
ORDER BY department_id; 

SQLPLUS에서 커서 안에이 쿼리를 가지고 그리고 그것은 오류주고 : 나는 오류가 라인 3에 있음을 알고

ORA-01427: single-row subquery returns more than one row 

을 , 그러나 나는 그것을 고치는 법을 모른다. 누군가 나를 도울 수 있다면, 나는 그것을 고맙게 생각할 것이다.

답변

0

직원 테이블에 여러 부서가 있기 때문에 이러한 상황이 발생합니다. 따라서 하위 쿼리는 각 부서의 평균 급여를 반환합니다.

아래의 쿼리를 사용해보십시오.


    SELECT last_name, department_id, salary 
    FROM employees e1 
    WHERE salary >(SELECT AVG(salary) 
       FROM employees e2 
       WHERE e2.department_id = e1.department_id 
       GROUP BY e2.department_id) 
    ORDER BY department_id; 

그러나이 방법을 사용하면 하위 쿼리에서 각 행에 대해 평균 급여가 계산됩니다.

더 나은 접근 방식이 될 수 있습니다.


    SELECT e1.last_name, e1.department_id, e1.salary 
    FROM employees e1 
    INNER JOIN (SELECT department_id, AVG(salary) avgsalary 
       FROM employees 
       GROUP BY department_id) as AvgSalaries on e1.department_id = AvgSalaries.department_Id 
    WHERE e1.salary > AvgSalaries.avgsalary 
    ORDER BY department_id; 

이렇게 평균 급여는 모든 부서에서 한 번만 계산됩니다.

오라클에만 해당되는 것으로 인식되지만 구문은 약간 다를 수 있지만 일반적인 아이디어는 동일해야합니다.

+0

감사합니다. 정말 도움이되었습니다. –

+0

도움이 된 것을 기쁘게 생각합니다. – poaca