[트리구조]
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 쿼리를 잘 작성하면 더 좋은 방법이 있을듯합니다만 잘 모르겠네요..ㅠㅠ.)
쿼리문이나 괜찮은 알고리즘 또는 함수가 있다면 주저말고 답글남겨주세요~(__
<p>무슨 자료 트리 같은거 만드는거 같은데..</p><p>단순히 tree 를 위한 table이라면 위에서 처럼 lv컬럼 안써도 될듯...</p><p><br></p><p>참고)</p><p>CREATE TABLE nodetable (<br> id varchar2(4) ,<br> p_id VARCHAR2(4)<br>);</p><p><br></p><p>자료 집어넣고~~~ㅎ<br></p><p><br></p><p>SELECT ROWID,id,p_id,LEVEL-1 lv<br>FROM nodetable<br><span style="font-weight: bold;">START WITH id='Root'</span><br><span style="font-weight: bold;">CONNECT BY p_id=PRIOR id</span><br>ORDER siblings BY id;<br></p><p><br></p><p>쿼리하면 아까 저 table나올끼고...<br></p><p>노드딴데 넣을라면</p><p><br></p><p>UPDATE nodetable <br>SET p_id='Root'<br>WHERE ROWID='AAAGJWAAIAAEe4KAAK';<br></p><p><br></p><p>걍 p_id만 바까주면 딴데간다는...</p><p><br></p><p><br></p><p>rowid 사용한건 걍..내맘..ㅋㅋㅋㅋ update 정확하게 보장.ㅎ</p><p>connect by 는 오라클만 데이에에에에에엠..ㅎ~</p><p><br></p><p>문제를 제대로 이해했나몰라.ㅋㅋ<br></p><p><br></p>
<p>ㅎㅎ 레벨은 없이~ 조회 했을때 정렬 순서가 부모행이 먼저만 나오면되요~ㅋ</p><p>VB에서 조회결과 순서대로 Tree 노드를 Add하는데 <br></p><p>부모노드가 없이 자식 노드를 먼저 Add하면 오류가 나서~</p><p>ㅎㅎㅎ Start With랑 Connect By 절은 잘 몰라서..-_- <br></p><p>단순 SQL문으로 짜려고하니 답이 잘안나오더라고요 ㅋ</p><p>그래서 레벨 컬럼을 넣어서 정렬하려 했었어요~^^;</p><p>Start With랑 Connect By 절 공부해서 적용해보고~</p><p>또 궁금한거 있음 글남길께요..^^;;</p><p><br></p><p>팀장님~ 관심있는 답변 감사해요~(__* <br></p>
<p>select LEVEL, EMPNO, ENAME, JOB, MGR <br />from emp <br />start with <br /> ename = 'KING' <br />connect by prior empno = mgr<br />order by level<br /></p>
<p>Start with & Connect by 공부해서 팀장님 답변활용해서</p>
<p>scott/tiger 계정으로 테스트 해봤어요~ㅎ</p>
<p> </p>
<p>부모항목이 먼저 나오게 순서대로 나오는게 필요했는데</p>
<p>LEVEL이라는 키워드가 있었군요!!!</p>
<p> </p>
<p>팀장님 덕에 Start with & Connect by 와 Level 키워드 공부했심니더~ 감사해용~!!!</p>
<p>Level 키워드 때문에 Lv 컬럼의 의미가 없어지겠네요~ㅎ</p>
<p> </p>
<p>p.s : 상품은 담에 맛난 음료 무료 이용!!! (제가 쏠게요~ㅋ)</p>