繁体   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