메뉴 건너뛰기

bysql.net

[질문] 트리뷰 노드관련 SQL 처리

2010.03.05 09:11

실천하자 조회 수:164384

[트리구조]


LV0           LV1          LV2         LV3


Root ─┬─  A ─┬─ AA1

          │           └─ AA2

          └─  B ─┬─ BB1

                        ├─ BB2 ──  BBB1

                        └─ BB3

  


[테이블 구조]  (트리구조와 ID 연관성 없음 - ID는 시각적 편의를 위해 규칙적으로 예를 들었음)


ID
P_ID
LV
 Root

 0

 A

 Root

 1

 AB1

 A

 2

 AB2

 A

 2

 B

 Root

 1

 BB1

 B

 2

 BB2

 B

 2

 BB3

 B

 2

 BBB1

 B2

 3


위의 형태를 VB Treeview를 사용하여 처리중.


[변경된 트리구조]


LV0           LV1          LV2         LV3


Root ─┬─  A ─┬─ AA1

          │           └─ AA2

          ├─ BB2 ── BBB1

          └─  B ─┬─ BB1

                        └─ BB3


LV2 에 있던 B의 자식 노드 BB2 가 LV1 로 옮겨지면서

BB2 에 속해있는 하위 노드의 LV 가 모두 1씩 감소되는 Update 처리 방법은 어떤게 좋을까요?

단, 자식노드의 수는 한정 없음, 레벨이 더 깊어 질수도 있음, 

(LV 컬럼을 사용하는 이유 : 트리뷰 작성 시 부모노드를 먼저 생성해주어야 자식노드 생성가능,

자식노드가 먼저 생성하려 할 시 오류발생, Order by LV로 조회하여 부모노드 행부터 노드 추가 방식)


if 변경노드.Chlidren > 0 then '자식노드가 있다면

  SQL = " Update NodeTable set LV = LV - 1 " & _

            " where  P_ID = 변경노드의 ID "


(Oracle 9i, VB 사용)


현재 생각한 내용은 (프로그램 내에서 재귀호출 방법인데 잘 못 돌면 무한루프에 빠질수도 있고해서

비효율적인거 같고 Sql 쿼리를 잘 작성하면 더 좋은 방법이 있을듯합니다만 잘 모르겠네요..ㅠㅠ.)



쿼리문이나 괜찮은 알고리즘 또는 함수가 있다면 주저말고 답글남겨주세요~(__