2012-10-14 6 views
0

Je souhaite utiliser des sous-requêtes dans SQL dans Oracle Express pour obtenir le salary_id des salaires les plus élevés que les employés obtiennent dans leurs départements. Les tableaux que j'ai sont:sous-requêtes dans 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 

D'abord, j'extrait le salaire maximum dans chaque département avec cette requête:

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

Les résultats sont deux records: 2000 et 2500

L'étape suivante est d'obtenir les notes de ces salaires, donc j'utilise ce qui suit:

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

L'erreur tha t J'ai reçu est: ORA-01427: sous-requête à une rangée retourne plus d'une rangée

Comment puis-je faire cette commande SQL avec des sous-requêtes en SQL?

+0

Comment la table des salaires est-elle liée à la table des employés? Où est la connexion? –

Répondre

1

Il existe plusieurs façons d'écrire de telles requêtes. Vous pouvez ajouter la sous-requête à la clause FROM:

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; 

Ou vous pouvez utiliser une sous-requête corrélative:

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

sont normalement sous-requêtes Corrélés plus lent, de sorte que la première forme est préférée.

+0

toute autre solution, le premier j'ai eu une erreur – Layla

+0

Quelle est l'erreur? –

+2

@ Manolo: le premier fonctionne, voir ici: http://sqlfiddle.com/#!4/0a1ab/1 vous devez avoir fait une erreur lors de la copie. –