我在SQLPLUS
中的游标中有这个查询SELECT last_name, department_id, salary
FROM employees
WHERE salary >(SELECT AVG(salary)
FROM employees
GROUP BY department_id)
ORDER BY department_id;
并且它给出了错误:
ORA-01427: single-row subquery returns more than one row
我知道错误在第3行,但我不知道如何修复它,如果有人可以帮助我,我会很感激。
答案 0 :(得分:0)
这种情况正在发生,因为您的employees表中有多个部门。所以你的子查询返回每个部门的平均工资。
您可以尝试以下查询;
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;
这样,所有部门的平均工资只计算一次。
注意到这是针对oracle的,语法可能略有不同,但总体思路应该是相同的。