2011-09-11 165 views
2

我需要一些关于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 

什么,我试图做的是:

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) 

,即时通讯得到的是错误: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 

任何帮助将非常感激。

+0

为什么你给这个'MySQL'添加了标签,你是否需要一个适用于Oracle和MySQL的答案? –

回答

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) 

但你会发现开沟标相关子查询和更换与派生表工作得更好。

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 

以下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 
+0

最后一部分工作。 – Geo

1

>操作符只接受一个值,从而你内心的SELECT必须返回恰好1排。我的猜测是你得到多行。看看你的内心SELECT返回,并尝试限制1.

1

我想你应该把额外d.department_id = department.department_id条件的子查询(未测试):

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 
       AND d.department_id = department.department_id 
       group by department_name) 

或者只是写:

select e.employee_name, 
     e.salary, 
     d.department_name 
from employee e, 
     department d 
where e.department_id = d.department_id 
     AND salary > (select ROUND(AVG(Salary), 2) Dept_avg_sal 
       from employee 
       where e.department_id = employee.department_id) 
相关问题