问题描述
嗨,
日安!
在我当前的需求中,我必须在单独的行中显示主详细信息关系。标题应仅显示主记录,而详细信息应仅显示详细记录。
我编写了一个查询,使用连接和联合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操作
也可以用任何分析函数来完成吗?
谢谢你,
致以问候,
阿米特
日安!
在我当前的需求中,我必须在单独的行中显示主详细信息关系。标题应仅显示主记录,而详细信息应仅显示详细记录。
我编写了一个查询,使用连接和联合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操作
也可以用任何分析函数来完成吗?
谢谢你,
致以问候,
阿米特
专家解答
为什么需要在查询中执行此操作?我还以为你可以加入我们的行列:
然后,在应用程序中定义哪些是标题行,哪些是详细信息。或者,如果您想更有趣,可以使用XML、JSON或对象类型返回一个带有详细信息的标题行:
无论如何,假设您必须在SQL中执行此操作,下面还有另一种只访问每个表一次的方法:
-像你一样把两个人联合起来。但是,将“水平”列设置为数字。部门为0 ,员工为1
-然后使用一个从级别= 0开始的分层查询将部门链接到员工。
scott模式已经存在于LiveSQL中!所以没有必要再创造一次。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




