簡體   English   中英

如何 select Oracle 中另一個子查詢的最大列的行

[英]How to select the row with the max column from another subquery in Oracle

基本上我試圖找到計數結果的最大值。 這是一個例子:

Desired output:工作數量和完成工作數量最多的員工的名稱。

我的表(粗體表示主鍵,* 表示外鍵):

  • 員工( 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;

這有點適用於我的情況,但不考慮具有相同最大值的多個員工。

有沒有一種簡單的方法來解決這個問題,顯然不改變數據庫布局,最好只使用子查詢(我還是個初學者)?

首先,看起來您需要按Employee.ID而不是Employee_name進行聚合,因為工作是按 ID 鏈接的,而不是按employee_name鏈接的。 因此,最好將聚合和 Top-N 推送到Jobs的子查詢中。 雖然 Oracle 有一個特殊的查詢轉換機制Group-By Pushdown 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聚合工作,並且僅with ties獲得前 1 名,然后我們只需加入Employee即可獲得Employee_name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM