SQLPLUS单行子查询返回多行

时间:2014-04-12 00:49:52

标签: subquery sqlplus

我在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行,但我不知道如何修复它,如果有人可以帮助我,我会很感激。

1 个答案:

答案 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的,语法可能略有不同,但总体思路应该是相同的。