Oracle SQL查询以基于类型获取父节点?

时间:2018-07-24 02:32:48

标签: oracle hierarchy connect-by

在构建层次结构查询以基于类型获取父节点时,我需要帮助。例如:

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。

3 个答案:

答案 0 :(得分:1)

您需要从叶到根构建树。

因此更改pid和cid:

 select pid
    from org
   start
    with cid = 7
 connect by prior pid = cid

答案 1 :(得分:0)

基于Oracle documentPRIOR运算符引用父行。

所以您的查询应该是

  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 WITHCONNECT BY之前)。

不清楚要SELECT做什么,但这应该很容易。

实际上,使用您所拥有的简单结构,WHERE子句就足够了。 CONNECT BY中没有附加条件意味着查询将执行比必要更多的工作;也会找到MGT行,但仍会在type = 'DEP'所在的唯一行中进行选择。