Oracle sql 查询根据类型获取父节点?

Oracle sql query to get parent node based on type?

我在构建分层查询以根据类型获取父节点方面需要帮助。例如:

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

感谢任何反馈。

2018 年 7 月 24 日更新:

一些可能有帮助的附加信息。

MGT(管理)是 highest/root 级别 DEP(部门)隶属于MGT。 DIV(部门)在 DEP 下。 SEC(部门)在 DIV.

因此,如果给定一个 SEC 类型的子 ID,我需要获取它所在的 DEP(部门)(这意味着我需要先获取 DIV,然后再获取 DEP)。如果给定类型 DIV 的子 ID,那么我需要获取它所在的 DEP。

您需要从叶到根构建您的树。

因此更改 pid 和 cid:

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

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

所以你的查询应该是

  select pid
    from org
   where level = 2 --to get DEP
 connect by prior pid = cid;

一个问题已经指出: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 行,但它仍然 select type = 'DEP'.

的唯一行