在组织层次结构中获取链条和最高父级
Get the chains and highest parent, in a hierarchy of organisations
我在 TABLE_A 中有以下数据,其中 ORG_1 是 ORG_2 的父级:
ORG_1 ORG_2
01 02
02 03
02 04
05 06
所以,org 01 是 org 02 的父级,org 02 是 03 和 04 的父级。org 5 只是 org 06 的父级。
我需要为链设置唯一的 names/numbers,并报告链中的最高父级。 Chain我定义为'all organisations that are related to each other'.
这是期望的结果:
Chain ORG_1 ORG_2 Highest_Parent_In_Chain
1 01 02 01
1 02 03 01
1 02 04 01
2 05 06 05
Chain=1 具有从 ORG_1=01 开始的树结构。 Chain=2 有自己的链。
我找到了一些关于 CONNECT BY、CONNECT BY PRIOR 和 CONNECT_BY_ROOT 的信息,但我无法使用它。有谁知道如何通过 Oracle 中的查询实现这一点?
链号可以用解析DENSE_RANK()
函数创建。
链中的最高父级是分层查询的一个特征:函数CONNECT_BY_ROOT()
。
您的层级 table 是非标准的 - 在标准排列中,顶层(组织 01
和 05
)也会有一行显示为 ORG_2
,NULL
为 ORG_1
。这样就很容易找到层次结构中的最高级别:只需查找 ORG_1 IS NULL
。事实上,START WITH
子句更复杂,因为我们必须先找到顶部。为此,我们寻找未出现在 ORG_2
中的 ORG_1
的值。那是在 START WITH
子句中的子查询中完成的工作。
with
table_a ( org_1, org_2 ) as (
select '01', '02' from dual union all
select '02', '03' from dual union all
select '02', '04' from dual union all
select '05', '06' from dual
)
-- End of simulated input data (for testing purposes only).
-- Solution (SQL query) begins BELOW THIS LINE.
select dense_rank() over (order by connect_by_root(org_1)) as chain,
org_1, org_2,
connect_by_root(org_1) as highest_parent_in_chain
from table_a
connect by org_1 = prior org_2
start with org_1 in
( select org_1 from table_a a
where not exists (select * from table_a where org_2 = a.org_1)
)
;
CHAIN ORG_1 ORG_2 HIGHEST_PARENT_IN_CHAIN
----- ----- ----- -----------------------
1 01 02 01
1 02 03 01
1 02 04 01
2 05 06 05
我在 TABLE_A 中有以下数据,其中 ORG_1 是 ORG_2 的父级:
ORG_1 ORG_2
01 02
02 03
02 04
05 06
所以,org 01 是 org 02 的父级,org 02 是 03 和 04 的父级。org 5 只是 org 06 的父级。
我需要为链设置唯一的 names/numbers,并报告链中的最高父级。 Chain我定义为'all organisations that are related to each other'.
这是期望的结果:
Chain ORG_1 ORG_2 Highest_Parent_In_Chain
1 01 02 01
1 02 03 01
1 02 04 01
2 05 06 05
Chain=1 具有从 ORG_1=01 开始的树结构。 Chain=2 有自己的链。
我找到了一些关于 CONNECT BY、CONNECT BY PRIOR 和 CONNECT_BY_ROOT 的信息,但我无法使用它。有谁知道如何通过 Oracle 中的查询实现这一点?
链号可以用解析DENSE_RANK()
函数创建。
链中的最高父级是分层查询的一个特征:函数CONNECT_BY_ROOT()
。
您的层级 table 是非标准的 - 在标准排列中,顶层(组织 01
和 05
)也会有一行显示为 ORG_2
,NULL
为 ORG_1
。这样就很容易找到层次结构中的最高级别:只需查找 ORG_1 IS NULL
。事实上,START WITH
子句更复杂,因为我们必须先找到顶部。为此,我们寻找未出现在 ORG_2
中的 ORG_1
的值。那是在 START WITH
子句中的子查询中完成的工作。
with
table_a ( org_1, org_2 ) as (
select '01', '02' from dual union all
select '02', '03' from dual union all
select '02', '04' from dual union all
select '05', '06' from dual
)
-- End of simulated input data (for testing purposes only).
-- Solution (SQL query) begins BELOW THIS LINE.
select dense_rank() over (order by connect_by_root(org_1)) as chain,
org_1, org_2,
connect_by_root(org_1) as highest_parent_in_chain
from table_a
connect by org_1 = prior org_2
start with org_1 in
( select org_1 from table_a a
where not exists (select * from table_a where org_2 = a.org_1)
)
;
CHAIN ORG_1 ORG_2 HIGHEST_PARENT_IN_CHAIN
----- ----- ----- -----------------------
1 01 02 01
1 02 03 01
1 02 04 01
2 05 06 05