2011-09-11 163 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) 
相關問題