Переписать некоррелированный подзапрос в коррелированный подзапрос - PullRequest
0 голосов
/ 12 ноября 2018

Я работаю с базой данных Oracle по умолчанию scott с дополнительной таблицей PROJECT, в которой есть два столбца: projectno и empno.

Я хочу выбрать имена сотрудников с самой высокой зарплатойдля каждого проекта.

Я знаю, как сделать это с некоррелированным подзапросом:

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, номне интересно, если это возможно?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Я бы сделал:

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
              );
0 голосов
/ 12 ноября 2018

Использовать оконные функции:

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;
...