2012-02-02 2 views
0

Я пытаюсь сделать «линейное слияние» в Oracle, то есть хочу получить запрос, который возвращает строки, и каждая из этих строк имеет для каждого столбца значения, которые первоначально были сохранены в других линий.«line fusion» in oracle

Например (я после documentation), скажем, у меня есть таблица EMP служащий хранения номер сотрудника, номер его отдела и его зарплату

Как создать запрос, который возвращает столько строк как отделы, и это также возвращает максимальную заработную плату в этом отделе?

Я хочу что-то вроде этого:

EMPNO  DEPTNO  SAL MAX_VAL_IN_DEPT 
---------- ---------- ---------- ----------------- 
    7934   10  1300    1300 
    7369   20  800    800 
    7900   30  950    950 

This query:

SELECT empno 
    , deptno 
    , sal 
    , FIRST_VALUE(sal IGNORE NULLS) OVER (PARTITION BY deptno ORDER BY sal ASC NULLS LAST) AS first_val_in_dept 
FROM emp; 

ближайший я смог найти, но я должен был бы дополнительный GROUP BY DeptNo пункт, который я не могу добавить.

ответ

2

Это будет быстрее, чем версия с отдельным суб-выбора.

Ваше заявление было близко, вам просто нужно использовать max():

select empno, 
     deptno, 
     sal, 
     max(sal) over (partition by deptno) as MAX_VAL_IN_DEPT 
from emp 

Не уверен, что ваши «большее число строк отделов» заявление, хотя. В вашем образце четко отображается одна «строка» для каждого сотрудника, а не отдела.

2

Делают это так:

SELECT e.empno 
    , e.deptno 
    , e.sal 
    , e2.maxsal AS MAX_VAL_IN_DEPT 
FROM emp e 
INNER JOIN (select t.deptno, max(sal) as maxsal from emp t group by t.deptno) e2 on e.deptno = e2.deptno; 
2

Может быть что-то вроде (непроверенные):

select 
e.empno, 
e.deptno, 
e.sal, 
d.max_sal 
from emp e, 
(
select deptno, max(sal) as max_sal 
from dept 
group by deptno 
) d 
where e.deptno = d.deptno 
; 

 Смежные вопросы

  • Нет связанных вопросов^_^