Tree 쿼리문 추가 질문 드립니다. 0 3 604

by 고재원 [SQLServer] [2021.11.23 16:11:29]


마농님 도움으로 아래와 같이 특정 Tree 내용을 하위 폴더까지 복사하는 기능을 처리 했습니다.

 

테이블 구조

아래와 같이 DB에 저장된 상태입니다.

         seq        pk_id       depth     foldername
9 7 2     21A063
10 8 7     UV LASER CUT SYSTEM
11 9 8     00_SOFTWARE_UNIT
12 10 9     *01_DIGITAL_IO
13 11 9     *02_INDUSTRIAL_PC
15 13 8     20_WORK TABLE UNIT
17 14 9     *03_VISION
       

이걸 Tree 구조로 보면 아래 그림과 같습니다. 여기까지는 작업을 했는데

 

 

 

제가 원하는 건 저 DB에 저장된 21A063 이란 폴더및 하위폴더 전체를 아래와 같이 새롭게 Insert 하고 싶습니다.

seq, pk_id, depth 만 변경해서, 폴더명은 그래도..

쿼리문을 사용해서 이게 가능할까요?

 

Seq 는 자동증가, pk_id도 가장 마지막 번호 + 1 해서 자동 증가

depth 는 pk_id 별로 번호 부여...

       

         seq        pk_id       depth     foldername
18 15 2     21A063
19 16 15     UV LASER CUT SYSTEM
20 17 16     00_SOFTWARE_UNIT
21 18 17     *01_DIGITAL_IO
22 19 17     *02_INDUSTRIAL_PC
23 20 16     20_WORK TABLE UNIT
24 21 20     *03_VISION

 

-- MSSQL --

WITH t AS

(

SELECT 9 seq, 7 pk_id, 2 depth, '21A063' foldername

UNION ALL SELECT 10,  8, 7, 'UV LASER CUT SYSTEM'

UNION ALL SELECT 11,  9, 8, '00_SOFTWARE_UNIT'

UNION ALL SELECT 12, 10, 9, '*01_DIGITAL_IO'

UNION ALL SELECT 13, 11, 9, '*02_INDUSTRIAL_PC'

UNION ALL SELECT 15, 13, 8, '20_WORK TABLE UNIT'

UNION ALL SELECT 17, 14, 9, '*03_VISION'

)

, t1 AS

( -- 1. 특정 폴더 및 하위 폴더 가져오기 --

SELECT *

  FROM t

 WHERE pk_id = 7

 UNION ALL

SELECT a.*

  FROM t a

     , t1 b

 WHERE b.pk_id = a.depth

)

, t2 AS

( -- 2. 새로운 번호(seq, pk_id) 부여하기 --

SELECT (SELECT MAX(seq  ) FROM t) + ROW_NUMBER() OVER(ORDER BY seq) seq

     , (SELECT MAX(pk_id) FROM t) + ROW_NUMBER() OVER(ORDER BY seq) pk_id

     , pk_id old_pk_id

     , depth

     , foldername

  FROM t1

)

-- 3. depth 가져오기 --

SELECT a.seq

     , a.pk_id

     , ISNULL(b.pk_id, a.depth) depth

     , a.foldername

  FROM t2 a

  LEFT OUTER JOIN t2 b

    ON a.depth = b.old_pk_id

;

 

 

추가로 질문 드립니다.

Tree 폴더를 복사할때 Sub 테이블에 있는 내용도 같이 복사되면서 sub 폴더 pk_id 값을 넣을 수 있나요??

아래 그림에서 1번에서 2번으로 복사는 잘 됩니다. 위에 처리해 주셔서..

1번을 2번으로 복사할때 3번내용이 4번으로 복사하고 싶습니다.

 

즉 해당 폴더에 있는 내용들도 같이 복사하고 싶습니다.

 

 

 

 

 

by 마농 [2021.11.23 17:13:07]

테이블 구조를 변경해야 할 것 같습니다.
폴더 복사시 원본 old_pk_id 를 별도 컬럼에 함께 저장하고
이 컬럼을 이용해 다시 서브테이블을 복사하면 될 것 같습니다.


by 고재원 [2021.11.23 17:30:48]

안녕하세요.

테이블 구조는 변경해도 무방합니다.

예시는 들어주실 수 없나요?

저에게는 너무 어려운 부분이라.. 부탁드립니다.


by 마농 [2021.11.23 17:41:50]

t 테이블에 복제가 완료된 상태
pk_id = 119 이고 old_pk_id = 33 을 가진 상태에서
아래 쿼리 실행하시면 됩니다.
 

SELECT a.pk_id
     , b.name
  FROM t a
 INNER JOIN s b
    ON a.old_pk_id = b.pk_id
;

 

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