ITPUB论坛-中国最专业的IT技术社区

   
 注册
热搜:
查看: 197|回复: 5

[每日一题] PL/SQL Challenge 每日一题:2018-3-24 CONNECT BY层次查询

[复制链接]
论坛徽章:
486
秀才
日期:2015-09-09 10:33:01秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21
跳转到指定楼层
1#
发表于 2018-3-29 03:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
/forum.php?m ... eid&typeid=1808

原始出处:


作者: Kim Berg Hansen

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

我有一张员工表,它带有一个指向自身的外键,指明谁是谁的经理:

create table qz_emp (
   empno    number primary key
, ename    varchar2(10)
, mgr      number references qz_emp
)
/

insert into qz_emp values (7839, 'KING'  , null)
/
insert into qz_emp values (7566, 'JONES' , 7839)
/
insert into qz_emp values (7788, 'SCOTT' , 7566)
/
insert into qz_emp values (7876, 'ADAMS' , 7788)
/
insert into qz_emp values (7902, 'FORD'  , 7566)
/
insert into qz_emp values (7369, 'SMITH' , 7902)
/
insert into qz_emp values (7698, 'BLAKE' , 7839)
/
insert into qz_emp values (7499, 'ALLEN' , 7698)
/
insert into qz_emp values (7521, 'WARD'  , 7698)
/
insert into qz_emp values (7654, 'MARTIN', 7698)
/
insert into qz_emp values (7844, 'TURNER', 7698)
/
insert into qz_emp values (7900, 'JAMES' , 7698)
/
insert into qz_emp values (7782, 'CLARK' , 7839)
/
insert into qz_emp values (7934, 'MILLER', 7782)
/
commit
/

我想要一个以树形层次显示的员工列表,从没有经理的员工开始,然后跟随着树中往下的层次。树中的兄弟节点(同一个经理下的同级别员工)必须以列名ENAME排序。

我有这个未完成的查询来产生这个列表:

select empno
     , lpad(' ', (level - 1) * 2) || ename as ename
     , mgr
  from qz_emp
##REPLACE##
/

哪些选项包含的代码可用来取代 ##REPLACE##,使得查询执行不出错并产生这个所需的输出:

     EMPNO ENAME                       MGR
---------- -------------------- ----------
      7839 KING
      7698   BLAKE                    7839
      7499     ALLEN                  7698
      7900     JAMES                  7698
      7654     MARTIN                 7698
      7844     TURNER                 7698
      7521     WARD                   7698
      7782   CLARK                    7839
      7934     MILLER                 7782
      7566   JONES                    7839
      7902     FORD                   7566
      7369       SMITH                7902
      7788     SCOTT                  7566
      7876       ADAMS                7788

(A)
start with mgr is null
connect by mgr = prior empno
order by level, ename

(B)
connect by mgr = prior empno
start with mgr is null
order by level, ename

(C)
start with mgr is null
connect by mgr = prior empno
order levels by ename

(D)
connect by mgr = prior empno
start with mgr is null
order levels by ename

(E)
start with mgr is null
connect by mgr = prior empno
order siblings by ename


(F)
connect by mgr = prior empno
start with mgr is null
order siblings by ename

(G)
start with mgr is null
connect by mgr = prior empno
order siblings by qz_emp.ename

(H)
connect by mgr = prior empno
start with mgr is null
order siblings by qz_emp.ename
论坛徽章:
2
秀才
日期:2017-09-25 15:10:56秀才
日期:2018-01-02 15:05:22
2#
发表于 2018-3-29 09:13 | 只看该作者
感谢kid 版主的无私奉献,peace and love!

使用道具 举报

回复
认证徽章
论坛徽章:
0
3#
发表于 2018-3-29 11:28 | 只看该作者
ABGH
A和B 没啥问题,最常见的,start with 和 connect by 顺序应该没啥区别。
CD order levels by ename 没见过这个用法,试了一下确实不行。
EF order siblings by ename 也没见过,跳出来ora-00976:不允许指定的伪劣或运算符。
     但是列ename 指定了表名 就可以了,还请newkid大神赐教

使用道具 举报

回复
论坛徽章:
273
秀才
日期:2016-06-24 09:21:04弗兰奇
日期:2017-09-21 21:20:13ITPUB15周年纪念
日期:2017-08-31 22:13:53秀才
日期:2017-01-20 11:00:36秀才
日期:2017-01-20 11:04:31妮可·罗宾
日期:2017-01-13 16:26:01秀才
日期:2016-05-20 15:09:32射手座
日期:2016-05-26 14:02:50双子座
日期:2016-05-25 16:05:44白羊座
日期:2016-05-23 11:49:19
4#
发表于 2018-3-29 11:52 | 只看该作者
答案:GH

A: start with,connect by 写法是对的,但order by level, ename 排序结果是按等级和别名,不满足要求
B: 与A 同, start with 和 connect by ,好像谁在前谁在后的写法是等价的
C: order levels BY ,没有这样的语法
D: 同C
E: order siblings by 树中的兄弟节点排序是样的写法,但这里 ename 已经是别名,会报:
   ORA-00976: Specified pseudocolumn or operator not allowed here.
F: 同E
G: 正确写法,排序的字段用表名或表别名以区分字段别名
H: 同G
   

使用道具 举报

回复
论坛徽章:
0
5#
发表于 2018-3-29 16:03 | 只看该作者
答案: G, H
A:  结果整体排序, 体现不了上下层次关系.
B:  START WITH CONNECT BY 位置可以互换,  但问题与A相同.
C:  没有order levels by 的用法.
D:  同C
E:  SELECT 别名 ename ,  与表列名 ename重复,  作为CLAUSE的别名ename中, 没有层次结构的含义, 不能用在order siblings by.
F:  同E
G:  可通过.  定义同层次结构的排序方式.  
H:  同G  . start with connect by 可互换

使用道具 举报

回复
论坛徽章:
1
弗兰奇
日期:2018-03-29 11:10:12
6#
发表于 2018-3-29 17:11 | 只看该作者
第一次接触,学习了!但是还是没有弄明白里面的关系

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 |
  | | |
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表