基本上我試圖找到計數結果的最大值。下面是一個例子:
期望輸出: 作業數量最多的員工的姓名和完成的作業數量。
我的表(粗體表示主鍵,* 表示外鍵):
員工(Id、employee_name、...)
站點(Site_id, Site_name ,....)
作業 ( Site_id *, Id *, DateJ)
這是我嘗試過的兩件事:
查詢#1:
Select
employee_name,
max(jobs_done) max_jobs
from
Employees E,
(select
id,
count(*) jobs_done from jobs
from jobs
group by id) t
where
E.id = t.Id
group by
employee_name;
這將回傳每個員工的最大作業量,這是毫無意義的,因為子查詢已經這樣做了,而且這不是想要的結果。
查詢#2:
Select
employee_name,
t.job_done
from
Employees E
(Select
id,
count(*) job_done
from Jobs
group by id) t
where
E.id = t.id
order by
jobs_done desc
fetch first row only;
這有點適用于我的情況,但不適用于具有相同最大值的多個員工。
有沒有一種簡單的方法可以解決這個問題,顯然不改變資料庫布局,最好只使用子查詢(我仍然是初學者)?
uj5u.com熱心網友回復:
首先,看起來您需要按Employee.ID而不是聚合Employee_name,因為作業是按 ID 鏈接的,而不是employee_name。因此最好將聚合和 Top-N 推入到Jobs. 雖然 Oracle 有特殊的查詢轉換機制Group-By Pushdown(甚至還有特殊的提示gby_pushdown),但最好讓自己的查詢更清晰、更可預測,不要依賴 CBO(Oracle Optimizer)魔法。其次,我建議至少對初學者使用 ANSI 連接語法,因為它更清晰一些。
所以它應該是這樣的:
Select
e.id,
e.employee_name,
j.jobs_done
from
(Select
id,
count(*) jobs_done
from Jobs
group by id
order by jobs_done desc
fetch first 1 row with ties
) j
join Employees e
on e.id = j.id
;
正如您所看到的,j子查詢通過聚合作業employee.id并僅獲取前 1 個with ties,然后我們只需加入Employee即可獲取Employee_name
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362830.html
下一篇:類圖的資料庫實作
