[英]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.