oracle 在父子关系上创建层次结构

bjg7j2ky  于 2023-05-16  发布在  Oracle
关注(0)|答案(1)|浏览(134)

考虑一个包含以下信息的表。子-父关系数据。表格数据:
| 儿童_CD|姓名|负责人_姓名|头_等级|母体_Cd|
| --------------|--------------|--------------|--------------|--------------|
| 二|DEF|血脑屏障|01| 1|
| 三|GHI| ZZZ| 02| 1|
| 四个|肯尼迪国际机场|XXX| 10个|二|

示例:

CREATE TABLE TEST_01 
   (  CHILD_CD NUMBER(5) NOT NULL, 
      NAME VARCHAR2(3), 
      HEAD_NAME VARCHAR2(3), 
      HEAD_RANK VARCHAR2(2), 
      PARENT_CD NUMBER(5) NOT NULL
   );

insert into test_01 (CHILD_CD, NAME, HEAD_NAME, HEAD_RANK, PARENT_CD)
values (2, 'DEF', 'BBB', '01', 1);

insert into test_01 (CHILD_CD, NAME, HEAD_NAME, HEAD_RANK, PARENT_CD)
values (3, 'GHI', 'ZZZ', '02', 1);

insert into test_01 (CHILD_CD, NAME, HEAD_NAME, HEAD_RANK, PARENT_CD)
values (4, 'JFK', 'XXX', '10', 2);

commit;

我们的最终输出需要存储为一个层次结构,如下所示。
| 代码_ID|姓名|负责人_姓名|头_等级|L1_代码|L2_代码|L3_代码|......你好。|L12_代码|R_ID| LVL_CNT|
| --------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|--------------|
| 1| ABC| XYZ| 07||||||1| 0|
| 1| ABC| XYZ| 07|二|||||二|1|
| 1| ABC| XYZ| 07|二|四个||||四个|二|
| 1| ABC| XYZ| 07|三|||||三|1|
| 二|DEF|血脑屏障|01||||||二|0|
| 二|DEF|血脑屏障|01|四个|||||四个|1|
| 三|GHI| ZZZ| 02||||||三|0|
| 四个|肯尼迪国际机场|XXX| 10个||||||四个|0|
这里,R_ID ->取层次结构的最后一个CODE_ID。LVL_CNT ->取R_ID相对于主CODE_ID的最大分层计数数。
级别“% 1”的Child_Cd未存储在此处,因为它们没有“% 1”的Parent_Cd。所以我想知道是否有可能使用SQL查询而不是编写一些匿名块来实现结果?

uqcuzwp8

uqcuzwp81#

CREATE TABLE family 
(
    id varchar(100),
    parent varchar(100),
    child varchar(100),
);
---------------------------------
INSERT INTO family
           (id
           ,parent
           ,child)
     VALUES
            ('1','balaram','muniyandi')  
            ('2','muniyandi','nandha')  
            ('3','nandha','sneha')  
            ('4','sneha','raj')  


                                           
----------------------------------------
SELECT
       t1.parent    AS level_1_cc_cd, 
       t1.child     AS level_2_cc_cd, 
       t2.child     AS level_3_cc_cd, 
       t3.child     AS level_4_cc_cd, 
       t4.child     AS level_5_cc_cd, 
       t5.child     AS level_6_cc_cd, 
       t6.child     AS level_7_cc_cd
FROM   family t1
       LEFT OUTER JOIN family t2 ON t1.child = t2.[parent] 
       LEFT OUTER JOIN family t3 ON t2.child = t3.[parent] 
       LEFT OUTER JOIN family t4 ON t3.child = t4.[parent] 
       LEFT OUTER JOIN family t5 ON t4.child = t5.[parent] 
       LEFT OUTER JOIN family t6 ON t5.child = t6.[parent]

This will work for you for sure. try this

相关问题