마농님 도움으로 아래와 같이 특정 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번으로 복사하고 싶습니다.
즉 해당 폴더에 있는 내용들도 같이 복사하고 싶습니다.