【问题标题】:need oracle query [duplicate]需要oracle查询[重复]
【发布时间】:2013-04-14 06:43:40
【问题描述】:

我正在练习 Oracle 子查询。(我是 Oracle 新手。)

问题:找出每个部门中收入最高的员工?

我的下面的查询有效(但我觉得它不是那么好,即使我得到了正确的结果)

select e.deptid, e.name, e.salary 
from employee e 
where e.salary = (select max(salary) 
                  from employee b 
                  where b.deptid = e.deptid )

还有其他简单的方法吗? (使用内部连接还是其他方式?)

我也想知道:我们究竟什么时候必须使用内连接而不是使用子查询?我们究竟什么时候必须使用子查询而不是内连接?

【问题讨论】:

  • 您的查询不适用于很多员工有相同薪水的情况
  • 为什么当有更多员工时它不起作用?,顺便说一句,员工和部门是不同的表......你知道为上述问题编写查询的其他方法吗?
  • 这不是提议的副本的副本...它正在做一些完全不同的事情。
  • @JonathanLeffler - 好吧,这个怎么样? stackoverflow.com/q/1533240/146325
  • 这对我来说效果更好......

标签: sql oracle top-n


【解决方案1】:

为什么在这里使用 JOIN?

select 
  deptid,
  min(name) keep (dense_rank first order by salary desc),
  max(salary)
from 
  employee 
group by
  deptid

【讨论】:

  • 我没有得到这个:min(name) keep (dense_rank first order by Salary desc),顺便说一句,还有其他方法吗?
【解决方案2】:

你很接近 - 你错过了rank中的工资订单

select *
from ( 
    select  dept_id , fname , salary , 
            rank() over (partition by dept_id order by salary) as rnk 
    from    department d, employee e 
    where   d.dept_id = e.deptid
where rnk = 1

【讨论】:

    【解决方案3】:

    我有另一个查询如下:

    select dept_id, fname,salary 
    from (select dept_id, fname,salary, 
          rank() over (order by salary desc) ranking 
          from department d, employee e 
          where d.dept_id = e.deptid) where ranking=1;
    

    我觉得上面是正确的,但我对上面的查询有疑问:我没有在我的查询中使用任何联接但我仍然能够从 2 个表中检索列..(所以没用连接数?)

    【讨论】:

    • 您没有使用来自 DEPARTMENT 的任何数据,那么为什么您认为需要将其包含在查询中?但无论如何,你的内部查询确实有一个连接,它只是使用 WHERE 子句的 oder 语法而不是 ANSI join ... on 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多