부모 - 자식 관계에 있는 컬럼에 대한 문의 0 3 707

by 잭키올 [2016.12.11 01:31:41]


안녕하세요.
SQL 초보 입니다.

다음과 같은 부모-자식 간의 관계에 있는 레코드가 있습니다.
흔히 사용하는 트리구조인데요.

신규 데이터가 '080101' 이라는 코드가 들어오면 저 테이블에 신규 추가가 되어야 하는 쿼리를 작성해야 하는데
로직을 생각하기가 힘드네요.

PAR_CD SON_CD LVL_NO
NULL 01 1
01 0101 2
0101 010101 3
0101 010102 3
NULL 02 1
02 0201 2
0201 020101 3
0201 020102 3
NULL 00 1

 

저 위에 해당하는 부모가 하나도 없으므로, 검색을 해서 없으면 아래와 같은 데이터를 생성해야 합니다.

PAR_CD SON_CD LVL_NO
NULL 08 1
08 0801 2
0801 080101 3

 

1 레벨이 없을때는 전부 생성을 하고, 1레벨이 있으면 2레벨 3레벨만 생성을 해야 합니다.

답변 부탁드립니다.
감사합니다.
:)


CREATE TABLE TEMP_Q01
(
  PAR_CD NVARCHAR(10)
, SON_CD NVARCHAR(10)
, LVL_NO NUMERIC(3)
)

INSERT INTO TEMP_Q01
SELECT 'NULL',  '01',  '1' FROM DUAL UNION ALL
SELECT '01',  '0101',  '2' FROM DUAL UNION ALL
SELECT '0101',  '010101',  '3' FROM DUAL UNION ALL
SELECT '0101',  '010102',  '3' FROM DUAL UNION ALL
SELECT 'NULL',  '02',  '1' FROM DUAL UNION ALL
SELECT '02',  '0201',  '2' FROM DUAL UNION ALL
SELECT '0201',  '020101',  '3' FROM DUAL UNION ALL
SELECT '0201',  '020102',  '3' FROM DUAL UNION ALL
SELECT 'NULL',  '00',  '1' FROM DUAL

 

 

by 우리집아찌 [2016.12.12 08:38:44]

merge문으로 처리해보세요 update쪽은 기술하지 마시고 insert만 기술해서 쓰세요

 

 


by 마농 [2016.12.12 09:39:14]
MERGE INTO temp_q01 a
USING
(
SELECT SUBSTR(x, 1, LEVEL*2-2) par_cd
     , SUBSTR(x, 1, LEVEL*2  ) son_cd
     , LEVEL lvl_no
  FROM (SELECT '080101' x FROM dual)
 CONNECT BY LEVEL <= LENGTH(x) / 2
) b
ON (a.son_cd = b.son_cd)
WHEN NOT MATCHED THEN
    INSERT VALUES(b.par_cd, b.son_cd, b.lvl_no)
;
INSERT INTO temp_q01
SELECT b.par_cd, b.son_cd, b.lvl_no
  FROM (SELECT SUBSTR(x, 1, LEVEL*2-2) par_cd
             , SUBSTR(x, 1, LEVEL*2  ) son_cd
             , LEVEL lvl_no
          FROM (SELECT '080101' x FROM dual)
         CONNECT BY LEVEL <= LENGTH(x) / 2
        ) b
     , temp_q01 a
 WHERE a.son_cd(+) = b.son_cd
   AND a.son_cd IS NULL
;

 


by 잭키올 [2016.12.17 13:02:09]

마농님 ~ ^^

답변 너무 감사드립니다.

구루비 사이트와서 많이 배워 가는데 마농님의 친절한 댓글, 도움을 저도 받아보고 싶었는데

이번에 처음으로 받아보네요.. ㅎㅎ

감사드립니다.

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