2013-03-11 3 views
0

Мои сотрудники таблица имеет 3 колонки:SQL запрос на трудоустроить таблице

  • emp_id,
  • emp_sal,
  • dept_id.

Мне нужно найти для каждого отдела сотрудника (сотрудников) с наибольшей зарплатой. Мне нужно вернуть emp_id, emp_sal и dept_id для этих сотрудников.

Заранее спасибо

ответ

4

ORACLE поддерживает общее табличное выражение и Windowing функции,

WITH employees_sal 
AS 
(
    SELECT emp_id, 
      emp_sal, 
      dept_id, 
      DENSE_RANK() OVER(PARTITION BY dept_id ORDER BY emp_sal DESC) ranks 
    FROM employee 
) 
SELECT emp_id, emp_sal, dept_id 
FROM employees_sal 
WHERE ranks = 1 
2

Там нет необходимости использовать КТР.

SELECT a.emp_id, a.emp_sal, a.dept_id 
FROM employ a 
WHERE a.emp_sal = 
    (SELECT MAX(b.emp_sal) 
    FROM employ b 
    WHERE b.dept_id = a.dept_id 
    AND A.emp_id = B.emp_id) 
+0

Равным образом, нет необходимости использовать коррелированный подзапрос либо. Оба метода в порядке. –

+0

Судя по репутации искателя, я просто хотел использовать то, что они, вероятно, смогут понять легче, чем изучение CTE. Этот запрос является распространенной практикой в ​​Oracle DB для PeopleSoft, поэтому его можно увидеть в другом коде, с которым вы взаимодействуете. –

+0

Этот запрос возвращает сотрудников, чья зарплата соответствует максимальной заработной плате. Он не возвращает сотрудников, которые являются самыми высокооплачиваемыми в каждом отделе. – APC

3
SELECT EMP_ID,EMP_SAL,DEPT_ID 
FROM EMP 
WHERE (DEPT_ID,EMP_SAL) IN (SELECT DEPT_ID,MAX(EMP_SAL) 
          FROM EMP GROUP BY DEPT_ID) 
+0

@ Aspirant - Вы уверены, что это действительный синтаксис Oracle *? –

+3

да его действительный синтаксис в oracle – Aspirant

0
SELECT * FROM 
( 
SELECT deptno, ename, sal 
    , MAX(sal) OVER (PARTITION BY deptno) dept_max_sal 
    , ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal desc) rno 
    FROM scott.emp 
) 
WHERE sal = dept_max_sal 
    -- AND rno = 1 -- Optional to eliminate same salary employee -- 
ORDER BY deptno, sal DESC, ename 
/

DEPTNO ENAME SAL DEPT_MAX_SAL RNO 
----------------------------------------------- 
10  KING  5000 5000   1 
20  FORD  3000 3000   2 -- same sal -- 
20  SCOTT 3000 3000   1 -- same sal -- 
30  BLAKE 2850 2850   1