繁体   English   中英

将不相关的子查询重写为相关的子查询

[英]Rewriting uncorrelated subquery to correlated subquery

我正在使用带有附加表PROJECT的默认oracle scott数据库,其中有两列: projectnoempno

我想为每个项目选择薪水最高的员工姓名。

我知道如何使用不相关的子查询:

SELECT p.projno, 
       e.sal, 
       e.ename
  FROM emp e 
 INNER 
  JOIN proj_emp p 
    ON e.empno = p.empno
 WHERE (e.sal, p.projno) 
    IN (SELECT MAX(e.sal), 
               p.projno 
          FROM emp e INNER JOIN proj_emp p 
            ON e.empno = p.empno
         GROUP BY p.projno)

但是,我被要求使用WHERE子句中编写的相关子查询来执行此操作,但是我想知道是否有可能?

我会做 :

SELECT t.*
FROM (SELECT p.projno, e.sal, e.ename,
             DENSE_RANK() OVER (PARTITION BY p.projno ORDER BY e.sal DESC) AS Seq
      FROM emp e INNER JOIN
           proj_emp p 
           ON e.empno = p.empno
     ) t
WHERE Seq = 1;

编辑:如果您想使用相关的子查询,那么我将重写您的查询以使相关

SELECT p.projno, e.sal, e.ename
FROM emp e INNER JOIN 
     proj_emp p 
     ON e.empno = p.empno
WHERE e.sal = (SELECT MAX(e1.sal)
               FROM emp e1 INNER JOIN 
                    proj_emp p1 
                    ON e1.empno = p1.empno
               WHERE p1.projno = p.projno
              );

使用窗口功能:

SELECT projno, sal, ename
FROM (SELECT p.projno, e.sal, e.ename,
             MAX(e.sal) OVER (PARTITION BY p.projno) as max_sal
      FROM emp e INNER JOIN
           proj_emp p 
           ON e.empno = p.empno
     ) ps
WHERE sal = max_sal;

暂无
暂无

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

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