Не в состоянии понять запрос - PullRequest
4 голосов
/ 19 июня 2011

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

select * 
from emp a where 2 > (select count( distinct(sal)) 
                      from emp 
                      where sal > a.sal and a.deptno=deptno)
order by deptno;

Ответы [ 3 ]

5 голосов
/ 19 июня 2011

Для каждой строки сотрудника запрос в предложении WHERE подсчитывает, сколько строк имеют более высокую зарплату в одном отделе.Затем само предложение WHERE ограничивает результаты только теми зарплатами, которые имеют 1 или 0 строк (2 >) в одном и том же отделе с большей зарплатой, т. Е. С двумя самыми высокими зарплатами.

Итак, с этими данными:

EmployeeId   Sal   DeptNo   No. of rows in the same department with higher salary
         1     1        1   3 (employees 2, 3 and 4)
         2     2        1   2 (employees 3 and 4)
         3     3        1   1 (employee 4)
         4     4        1   0
         5     1        2   2 (employees 6 and 7)
         6     2        2   1 (employee 7)
         7     3        2   0

... в запросе будут выбраны сотрудники 3, 4, 6 и 7, так как это сотрудники с количеством сотрудников менее 2, у которых зарплата выше, чем у них.

2 голосов
/ 19 июня 2011

Внутренний выбор возвращает количество более высоких зарплат в том же отделе для данного сотрудника. Теперь, если в одном и том же отделе меньше двух более высоких зарплат, то данный сотрудник должен быть главным или ближайшим лицом в отделе.

0 голосов
/ 20 июня 2011

Переместите подзапрос к предложению SELECT без ограничения 'top 2' (очевидно, будет возвращено больше строк):

        select a.*, 
               (
                select count( distinct(sal)) 
                  from emp 
                 where sal > a.sal and a.deptno=deptno
               ) as tally
          from emp a   

Затем можно ограничить набор результатов, используя предложение WHERE, вводящеедальнейший уровень, например

select b.* 
  from (
        select a.*, 
               (
                select count( distinct(sal)) 
                  from emp 
                 where sal > a.sal and a.deptno=deptno
               ) as tally
          from emp a
       ) b     
 where b.tally < 2
 order 
    by b.deptno, b.tally;

Выше приведен более подробный, но, возможно, легче следовать логике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...