在构建层次结构查询以基于类型获取父节点时,我需要帮助。例如:
Table (org)
pid|cid|type|name
| 1|MGT |Ofc Pres
1| 2|DEP |HR
1| 3|DEP |IT
3| 4|DIV |Web
3| 5|DIV |Database
4| 6|SEC |HTML
4| 7|SEC |JAVA
我的目标是根据CID(6或7)获得DEP。使用下面的查询,我只会得到pid(4)。
select pid
from org
start
with cid = 7
connect
by
prior cid = pid
感谢任何反馈。
更新07/24/2018:
一些其他信息可能会有所帮助。
MGT(管理)是最高/最高级别 DEP(部门)在MGT下。 DIV(分区)在DEP下。 SEC(部分)在DIV下。
因此,如果给定子类型为SEC的子ID,我需要获取它所在的DEP(部门)(这意味着我需要先获取DIV,然后再获取DEP)。如果给定了DIV类型的子ID,那么我需要获取它所在的DEP。
答案 0 :(得分:1)
您需要从叶到根构建树。
因此更改pid和cid:
select pid
from org
start
with cid = 7
connect by prior pid = cid
答案 1 :(得分:0)
基于Oracle document,PRIOR
运算符引用父行。
所以您的查询应该是
select pid
from org
where level = 2 --to get DEP
connect by prior pid = cid;
答案 2 :(得分:0)
已经指出了一个问题:connect by prior pid = cid
。要在类型为DEP
时停止,您需要向connect by
添加一个条件:
connect by prior pid = cid and prior type != 'DEP'
并添加一个`WHERE子句:
where type = 'DEP'
(请注意,WHERE
子句位于START WITH
和CONNECT BY
之前)。
不清楚要SELECT
做什么,但这应该很容易。
实际上,使用您所拥有的简单结构,WHERE
子句就足够了。 CONNECT BY
中没有附加条件意味着查询将执行比必要更多的工作;也会找到MGT行,但仍会在type = 'DEP'
所在的唯一行中进行选择。