我學習的Oracle SQL用其原始HR
模式工作,其中有EMPLOYEES
表,有三列,我很感興趣的主要是:MANAGER_ID
,這基本上是一個自我引用EMPLOYEES.EMPLOYEE_ID
, DEPARTMENT_ID
和SALARY
。 (您可以在這裏找到schema diagram和schema objects)。如何改善這種自聯接
我希望每個員工都可以檢索他/她的SALARY
,以及員工經理的部門平均工資。舉例來說,如果我們有以下的(EMPLOYEE_ID = 140
是這裏的利害關係人):
+-------------+--------+---------------+------------+
| EMPLOYEE_ID | SALARY | DEPARTMENT_ID | MANAGER_ID |
+-------------+--------+---------------+------------+
| 140 | 12000 | 50 | 110 |
| 110 | 20000 | 60 | 101 |
| 156 | 18000 | 60 | 101 |
| 175 | 15000 | 60 | 105 |
| 320 | 24000 | 60 | 105 |
+-------------+--------+---------------+------------+
我很感興趣,在部門獲得所有管理人員的平均工資(並非所有其他非管理人員)哪裏僱員的經理工作在(在這種情況下,DEPARTMENT_ID =
),並將其與員工的(在這種情況下,)進行比較。另外,在上述採樣數據,輸出應該是:
+-------------+--------+-------------+-------------+------------+
| EMPLOYEE_ID | SALARY | AVG_MGR_SAL | MGR_DEPT_ID | MANAGER_ID |
+-------------+--------+-------------+-------------+------------+
| 140 | 12000 | 19250 | 60 | 110 |
+-------------+--------+-------------+-------------+------------+
在那裏我們有四(4)在部門,和$ 19250工作管理者被計算爲(20000 + 18000 + 15000 + 24000)/ 4.我想出了下面的查詢,似乎工作(並排除沒有經理的員工):
select
employee_id
, salary employee_salary
, trunc(mgr_info.avg_manager_salary_per_dept, 0) emp_manager_avg_sal_dept
, mgr_info.manager_dept_id
, mgr_info.manager_id
from employees
join (
select
e1.employee_id manager_id
, e1.department_id manager_dept_id
, e1.salary manager_salary
, avg(e1.salary) over (partition by e1.department_id) avg_manager_salary_per_dept
from employees e1
join (
select distinct manager_id
from employees
where manager_id is not null
) mgr_ids
on e1.employee_id = mgr_ids.manager_id
) mgr_info
on employees.manager_id = mgr_info.manager_id
order by employee_id
不過,我覺得應該有獲得更好的方法相同的結果與更少的自我連接。有沒有辦法獲得更好的表現?
你能告訴我們對經理來說是什麼樣的記錄? –
請澄清......對於您給出的例子,您希望60部門的平均工資,但不是該部門的所有員工的平均工資,而僅僅是爲管理人員的員工? (當然包括原僱員的經理。) – mathguy
請至少顯示一個完整的示例輸入和輸出,所以我們不必猜測。 –