2012-10-14 6 views
0

Oracle Express의 SQL에서 서브 쿼리를 사용하여 직원이 자신의 부서에서받는 최고 급여의 salary_id를 가져 오려고합니다. 내가 가진 테이블은 다음과 같습니다Oracle SQL의 서브 쿼리

먼저
Employee 
Emp_id Salary Dept_id 
100  1000 a101 
200  2000 a101 
300  2500 b102 

Salary 
Grade LowSal HiSal 
1  500 900 
2  901 2000 
3  2001 3000 

내가이 쿼리와 각 부서의 최대 급여를 추출 : 2000 및 2500

다음 단계 :

SELECT Max(e.SALARY) 
FROM EMPLOYEE e 
GROUP BY e.DEPT_ID 

결과는 두 개의 레코드입니다 그 급여의 성적을 얻는 것이므로 다음을 사용합니다 :

SELECT GRADE 
FROM SALARY 
WHERE (SELECT Max(e.SALARY) 
     FROM EMPLOYEE e 
     GROUP BY e.DEPT_ID) BETWEEN LOWSAL AND HIGHSAL; 

오류 그쪽으로 ORA-01427 : 단일 행 하위 쿼리가 둘 이상의 행을 반환합니다.

SQL에서 하위 쿼리로 SQL 명령을 어떻게 수행 할 수 있습니까?

+0

급여 테이블은 어떻게 직원 테이블에 링크됩니까? 연결은 어디 있습니까? –

답변

1

이러한 쿼리를 작성하는 방법은 여러 가지가 있습니다.

SELECT grade 
FROM (SELECT max(salary) AS sal FROM employee GROUP BY dept_id) ms 
JOIN salary ON ms.sal BETWEEN salary.lowsal AND salary.hisal; 

을 또는 당신은 상관 하위 쿼리 사용할 수 있습니다 : 당신은 FROM 절에 서브 쿼리를 추가 할 수 있습니다 첫 번째 양식을 선호하므로,

SELECT (SELECT grade FROM salary WHERE max(salary) BETWEEN lowsal AND hisal) 
FROM employee 
GROUP BY dept_id 

상관 서브 쿼리는 일반적으로 느린합니다.

+0

다른 해결책, 처음에는 오류가 발생했습니다 – Layla

+0

무엇이 오류입니까? –

+2

@Manolo : 첫 번째 작업은 http://sqlfiddle.com/#!4/0a1ab/1을 참조하십시오. 복사 할 때 오류가 발생 했어야합니다. –