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 知识图文详细教程之缓存融合技术和主要后台进程

Oracle 集群ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(转)

不是Oracle微软,谁在抢占数据库与AI融合的先机?

《大数据日知录:架构与算法》读书笔记(多图)

辽宁省人民医院:Oracle RAC和虚拟化平台的融合灾备建设