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 document,PRIOR
运算符引用父行。
所以你的查询应该是
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 WITH
和 CONNECT BY
之前)。
不清楚你想要什么SELECT
,但这应该很容易。
实际上,使用您的简单结构,WHERE
子句就足够了。在 CONNECT BY
中没有附加条件意味着查询将做比必要的多一点的工作;它也会找到 MGT 行,但它仍然 select type = 'DEP'
.
的唯一行
我在构建分层查询以根据类型获取父节点方面需要帮助。例如:
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 document,PRIOR
运算符引用父行。
所以你的查询应该是
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 WITH
和 CONNECT BY
之前)。
不清楚你想要什么SELECT
,但这应该很容易。
实际上,使用您的简单结构,WHERE
子句就足够了。在 CONNECT BY
中没有附加条件意味着查询将做比必要的多一点的工作;它也会找到 MGT 行,但它仍然 select type = 'DEP'
.