안녕하세요.
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
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 ;