我是个新手,对oracle很有兴趣,近来读你的层次查询更新版的,看了一半觉得几个地方不太明白 还请指教,谢谢!
1、prior关键字,父子关系的确定。
5.2.2中有
方向:
1.
自顶向下遍历:就是先由根节点,然后遍历子节点。column_1表示父key,column_2表示子key。即这种情况下:connect by prior 父key=子key表示自顶向下,等同于connect by 子key=prior 父key.
例如:
select
level,id,manager_id,last_name, title from s_emp
start
with
manager_id=2
connectbyid=prior manager_id;--自下而上遍历
---------------------------
你这里标题写的是自顶而下,而下面的示例代码的最后给的注释 却是“自下而上”。矛盾啊!?
我猜是不是这样的?
select
level,id,manager_id,last_name, title from s_emp
connect
by
id=prior manager_id;--自顶而下遍历
这个是自顶而下,因为 按照” connect by prior 父key=子key 来看凡是有prior的应该是父,查询找出了"子"
即id,id是结果集的一个属性列。我没查资料不知道是不是猜错了?
2、 5.23节语句不是很连贯,逻辑看不太懂。
原文:
例如现在的需求是,输出s_emp等级报表,root节点的last_name不变,比如第2等级,也就是level=2的前面加两个’_’符号,level=3的前面加4个。这样我们可以得到一个公式就是:
Lpad(last_name,length(last_name)+(level*2)-1,’_’)
其中一句“比如第2等级”,该句上下文不是很连贯。读不懂描述的是啥。而且注意到这个公式和下文的代码中的公式也是不一样的。代码中给出的公式中是(level*2)-2是减2 而不是减1。
我猜你可能是想说
例如现在的需求是,输出s_emp等级报表,root节点的last_name不变,其他等级每低一级前缀两个”_”
但这样公式应该是
(level-1)*2
3、5.2.6节的 “7)合计层次”
第2个需求的示例代码的connect by部分。
原文:
select last_name,salary,(
select sum(salary) from
s_emp
start with id=a.id –让每个节点都成为root
connect by prior id=manager_id) sumsalary
from s_emp a;
如果父子关系是我理解的那样,那么是否应该是这样的呢?
connect by id = prior manager_id
|