oracle中的“线融合”
Posted
技术标签:
【中文标题】oracle中的“线融合”【英文标题】:"line fusion" in oracle 【发布时间】:2012-02-02 13:24:19 【问题描述】:我正在尝试在 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 子句。
【问题讨论】:
【参考方案1】:这将比带有单独子选择的版本更快。
你的陈述很接近,你只需要使用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;
【讨论】:
【参考方案3】:可能类似于(未经测试):
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
;
【讨论】:
以上是关于oracle中的“线融合”的主要内容,如果未能解决你的问题,请参考以下文章
使用融合中间件控制 (EM) 为 Oracle 商业智能组件启用 SSL
Oracle 集群ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程