oracle에서 계층형으로 표현 하고 싶습니다. 0 3 2,254

by 열공이 [SQL Query] ORACLE 계층형 [2019.04.19 04:00:28]


계층형 구조를 갖는 생산품모자관계 테이블에서 부모와 자식간의 관계를 나타내고 싶습니다.

계층형은 부모공정명, 자식공정명으로 모자관계를 갖습니다.

생산품모자관계 테이블 (TB_PAR_CHR) 구조 및 데이터

SEQ       부모공정명(P_WORKS)    부모생산번호(P_NO)    자식공정명(C_WORKS)    자식생산번호(C_NO)

 1                     제강                          A0010                   주조                         B0010 

 2                     제강                          A0010                   주조                         B0020 

 3                     주조                          B0010                   전단                         C0010 

 4                     전단                          C0010                   열연                         E0010

 5                     전단                          C0010                   열연                         E0011

 6                     주조                          B0020                   전단                         C0020 

 7                     전단                          C0020                   후판                         F0010

 

원하는 출력 형태 (제강에서 생산된 하나의 생산품 밑에 있는 모든 자식 생산번호를 계층적으로 표시하고 싶음) 

    생산번호                공정명 

      A0010                   제강

         B0010                 주조

           C0010               전단

             E0010             열연

             E0011             열연

           C0020               전단

             F0010             후판

             F0011             후판

            

<참고 : 공정계층구조 각공정별로 생산번호를 KEY하는 별도의 테이블로 구성되고 있음>

제강 --- 주조 ----- 전단 ------ 열연 -

              |            |---------- 후판 

              |-------- 단조 ------ 열처리

              |             |---------- 가공

           분괴 ------ 연삭-------크랭크

                            |--------- 봉강  

 

by 타핑이 [2019.04.19 13:12:33]

아무도 답글이 없길래....

앞뒤 전후 사정 다 빼고 그냥 주신 것만 만들어봤습니당!!

 


by 마농 [2019.04.22 08:42:50]

일반적인 계층구조 테이블과 살짝 다르네요.
최상위인 '제강' 도 부모를 널로 하는 자식으로서 하나의 행을 가져야 하고요.
부모공정명은 별도로 관리하지 않는 것이 일반적입니다.
예) 코드, 코드명, 부모코드
오라클에서 계층쿼리는 start with ~ connect by 를 이용합니다.


by 마농 [2019.04.22 11:26:23]
WITH tb_par_chr AS
(
SELECT 1 seq, '제강' p_works, 'A0010' p_no, '주조' c_works, 'B0010' c_no FROM dual
UNION ALL SELECT 2, '제강', 'A0010', '주조', 'B0020' FROM dual
UNION ALL SELECT 3, '주조', 'B0010', '전단', 'C0010' FROM dual
UNION ALL SELECT 4, '전단', 'C0010', '열연', 'E0010' FROM dual
UNION ALL SELECT 5, '전단', 'C0010', '열연', 'E0011' FROM dual
UNION ALL SELECT 6, '주조', 'B0020', '전단', 'C0020' FROM dual
UNION ALL SELECT 7, '전단', 'C0020', '후판', 'F0010' FROM dual
)
SELECT p_works works
     , p_no    no
  FROM tb_par_chr
 WHERE p_no = 'A0010'
   AND ROWNUM = 1
 UNION ALL
SELECT LPAD(' ', LEVEL*2, ' ') || c_works works
     , LPAD(' ', LEVEL*2, ' ') || c_no    no
  FROM tb_par_chr
 START WITH p_no = 'A0010'
 CONNECT BY PRIOR c_no = p_no
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입