在组织层次结构中获取链条和最高父级

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 是非标准的 - 在标准排列中,顶层(组织 0105)也会有一行显示为 ORG_2NULLORG_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