单行子查询返回多行

Geo*_*Geo 2 sql oracle

我需要一些oracle sql的帮助.问题:我有2个员工和部门表.我从一个查询得到了平均部门薪水,我想用它来看看有多少员工赚的钱多于他们部门的平均水平.到目前为止我有这个.

此查询返回部门的平均值:

select ROUND(AVG(Salary), 2) Dept_avg_sal
 from employee, department
 where department.department_id = employee.department_id
 group by department_name
Run Code Online (Sandbox Code Playgroud)

我想做的是:

select employee_name,
       salary,
       d.department_name
from   employee e,
       department d
where  salary > (select ROUND(AVG(Salary), 2) Dept_avg_sal
                 from   employee,
                        department
                 where  department.department_id = employee.department_id
                 group  by department_name)  
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:01427.00000 - "单行子查询返回多行"

我知道同一部门的2名员工赚的钱多于平均水平,我认为这是造成这个问题的原因.

EMPLOYEE_NAME       - SALARY -                -DEPARTMENT_NAME-      DEPT_AVG_SAL           
-------------------- ---------------------- -------------------- ------------ 
FISHER              - 3000.00  -              SALES      -          2500.00                   
JONES          -      3000.00               - ACCOUNTING         -  2750.00                   
KING             -    5000.00           -     EXECUTIVE     -       4500.00                   
**SCOTT           -     2500.00           -     IT             -      2100.00                   
SMITH           -     2900.00          -      IT     -              2100.00**                   
WILSON           -    3000.00          -      RESEARCH      -       2633.33 
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.

Mar*_*ith 7

您的初始查询缺少外部查询的任何连接条件以及内部查询中的任何相关条件,这些条件将仅限于感兴趣的部门的行.通常你也不希望group by name大概id是主键.

解决这些问题以修复相关子查询

SELECT e.employee_name,
       e.salary,
       d.department_name
FROM   employee e
       JOIN department d
         ON d.department_id = e.department_id
WHERE  e.salary > (SELECT ROUND(AVG(Salary), 2) Dept_avg_sal
                   FROM   employee e2
                   WHERE  e2.department_id = e.department_id)  
Run Code Online (Sandbox Code Playgroud)

但是你可能会发现抛弃标量相关的子查询并用派生表替换效果更好.

SELECT e.employee_name,
       e.salary,
       d.department_name
FROM   employee e
       JOIN department d
         ON d.department_id = e.department_id
       JOIN (SELECT ROUND(AVG(Salary), 2) Dept_avg_sal,
                    department_id
             FROM   employee
             GROUP  BY department_id) e2
         ON e2.department_id = e.department_id
            AND e.salary > e2.Dept_avg_sal  
Run Code Online (Sandbox Code Playgroud)

对于Oracle,我认为以下也应该有效

SELECT employee_name,
       salary,
       d.department_name
FROM   (SELECT employee_name,
               salary,
               d.department_name,
               AVG(Salary) OVER (PARTITION BY e.department_id) AS AvgSalary
        FROM   employee e
               JOIN department d
                 ON d.department_id = e.department_id)
WHERE  salary > AvgSalary  
Run Code Online (Sandbox Code Playgroud)