繁体   English   中英

请参阅内部查询Where子句中的外部列

[英]Refer to outer column in inner query Where clause

我有两张表Employee和Departament关系如下所示。 对于每个部门,我想获得第五名最佳薪酬员工。

在此输入图像描述

如果我们有例如MySQL,查询应该如何?

我试图做这样的事情,但它没有在内部选择中看到d.id列。

select d.name, e.id from Employee e
join Departament d on d.id = e.dep_id
where e.id = (
    select s.eid from (
        select ee.id as eid, @rowid:=@rowid+1 as rowid from Employee ee, (SELECT @rowid:=0) as init
        where ee.dep_id = d.id
        order by ee.salary desc
     ) s
    where s.rowid = 5
)

是否有可能以通用方式执行它而不依赖于任何数据库语义?

如何使用MySQL做到这一点,最好的方法是什么?

只需在from子句中执行row_id计算:

select d.name, e.id
from (select ee.*,
             (@rowid := if(@d = dept_id, @rowid + 1,
                           if(@d := dept_id, 1, 1)
                          )
             ) as rowid
      from Employee ee cross join
            (SELECT @rowid := 0, @d := NULL) as init
      order by ee.dept_id, ee.salary desc
     ) e join
     Departament d
     on d.id = e.dept_id
where e.rowid = 5;

而且,是的,有一种ANSI标准方法可以做到这一点。 事实上,我可以很容易地想到两种方法。 但MySQL既不支持窗口函数也不支持fetch first 1 row only

  SELECT X.NAME, X.SALARY AS SAL_5 FROM
     (
     SELECT DEPT.NAME,EMP.SALARY, RANK() OVER (PARTITION BY NAME ORDER BY SALARY DESC) RN
      FROM EMP, DEPT
     WHERE EMP.DEPT_ID=DEPT.DEPT_ID
     ) X
     WHERE X.RN=5;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM