暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 查询以在单独的行中显示主表-明细输出

askTom 2017-01-26
120

问题描述

嗨,

日安!
在我当前的需求中,我必须在单独的行中显示主详细信息关系。标题应仅显示主记录,而详细信息应仅显示详细记录。

我编写了一个查询,使用连接和联合all和输出显示正确。然而,代码看起来非常笨拙和有点复杂,因为我有很多级别,如主程序,细节,子程序。所以在这种情况下,我将使用3个联合。
是否有其他方法可以为此编写查询。
使用Scott架构考虑员工和部门表的示例查询如下所示:

注意: TestScript可在以下位置获得:
https://livesql.oracle.com/apex/livesql/s/ehjst59eahrc0i4cw7h1le9bi

选择级别,
(当级别='H'时,其他部门无空结束时的情况)部门:
(当级别='H'时, DNAME否则为空结束时的情况) DNAME ,
ENAME ,
EMP_DEPNO ,
萨尔
发自(
选择“H”级别、DEPTNO、DNAME、NULL ENAME、NULL EMP_DPTNO、NULLSAL、DEPTNOREF_DPTNO
从部门
联合全部
选择“D”级别、B.DPTNO、B.DNAME、A.ENAME、A.DPTNO、A.SAL、B.DPTNOREF_DPTNO
来自EMP A、B部门
其中A.Depno=B.Depno
)
按参考DPTNO排序, DECODE (级别,'H', 1 ,'D', 2 ) ;

输出为:

标高部门编号DNAME ENAME EMP_DEPNO SA
H10会计
D克拉克10 2450
D米勒10 1300
D King 10 5000
H20研究
D史密斯20 800
D福特203000
D ADAMS 20 1100
D斯科特20 3000
D琼斯20 2975
H 30销售
D艾伦30 1600
D詹姆斯30 950
D特纳30 1500
D布莱克30 2850
D马丁30 1250
D区30 1250
H 40操作


也可以用任何分析函数来完成吗?

谢谢你,
致以问候,
阿米特

专家解答

为什么需要在查询中执行此操作?我还以为你可以加入我们的行列:

select * from scott.emp e
join   scott.dept d
on     d.deptno = e.deptno;


然后,在应用程序中定义哪些是标题行,哪些是详细信息。或者,如果您想更有趣,可以使用XML、JSON或对象类型返回一个带有详细信息的标题行:

select xmlforest(
         d.dname as "deptName",
         xmlagg(
           xmlelement("employee",
             xmlforest(
               e.empno as "empno",
               e.ename as "empname",
               e.job as "job"
             )
           ) 
         ) as "employees"
       ) as dept_emps
from   scott.emp e
right join scott.dept d
on     d.deptno = e.deptno
group  by d.deptno, d.dname;

ACCOUNTING

  
    7782
    CLARK
    MANAGER
  
  
    7934
    MILLER
    CLERK
  
  
    7839
    KING
    PRESIDENT
  


RESEARCH

  
    7369
    SMITH
    CLERK
  
  
    7902
    FORD
    ANALYST
  
  
    7876
    ADAMS
    CLERK
  
  
    7788
    SCOTT
    ANALYST
  
  
    7566
    JONES
    MANAGER
  


SALES

  
    7499
    ALLEN
    SALESMAN
  
  
    7900
    JAMES
    CLERK
  
  
    7844
    TURNER
    SALESMAN
  
  
    7698
    BLAKE
    MANAGER
  
  
    7654
    MARTIN
    SALESMAN
  
  
    7521
    WARD
    SALESMAN
  


OPERATIONS

  



无论如何,假设您必须在SQL中执行此操作,下面还有另一种只访问每个表一次的方法:

-像你一样把两个人联合起来。但是,将“水平”列设置为数字。部门为0 ,员工为1
-然后使用一个从级别= 0开始的分层查询将部门链接到员工。

select * from (
select 0 lev,deptno,dname,null ename,null sal
from   scott.dept
union all
select 1 lev, deptno, null dname,a.ename,a.sal
from   scott.emp a
)
start with lev = 0
connect by prior lev = lev - 1
and     prior deptno = deptno;

LEV  DEPTNO  DNAME       ENAME   SAL    
0    10      ACCOUNTING                 
1    10                  CLARK   2,450  
1    10                  MILLER  1,300  
1    10                  KING    5,000  
0    20      RESEARCH                   
1    20                  SMITH   800    
1    20                  FORD    3,000  
1    20                  ADAMS   1,100  
1    20                  SCOTT   3,000  
1    20                  JONES   2,975  
0    30      SALES                      
1    30                  ALLEN   1,600  
1    30                  WARD    1,250  
1    30                  MARTIN  1,250  
1    30                  BLAKE   2,850  
1    30                  TURNER  1,500  
1    30                  JAMES   950    
0    40      OPERATIONS 


scott模式已经存在于LiveSQL中!所以没有必要再创造一次。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论