[질문] 트리뷰 노드관련 SQL 처리
2010.03.05 09:11
[트리구조]
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 쿼리를 잘 작성하면 더 좋은 방법이 있을듯합니다만 잘 모르겠네요..ㅠㅠ.)
쿼리문이나 괜찮은 알고리즘 또는 함수가 있다면 주저말고 답글남겨주세요~(__
댓글 3
-
휘휘
2010.03.06 16:11
-
실천하자
2010.03.06 18:34
ㅎㅎ 레벨은 없이~ 조회 했을때 정렬 순서가 부모행이 먼저만 나오면되요~ㅋ
VB에서 조회결과 순서대로 Tree 노드를 Add하는데
부모노드가 없이 자식 노드를 먼저 Add하면 오류가 나서~
ㅎㅎㅎ Start With랑 Connect By 절은 잘 몰라서..-_-
단순 SQL문으로 짜려고하니 답이 잘안나오더라고요 ㅋ
그래서 레벨 컬럼을 넣어서 정렬하려 했었어요~^^;
Start With랑 Connect By 절 공부해서 적용해보고~
또 궁금한거 있음 글남길께요..^^;;
팀장님~ 관심있는 답변 감사해요~(__*
-
실천하자
2010.03.08 16:19
select LEVEL, EMPNO, ENAME, JOB, MGR
from emp
start with
ename = 'KING'
connect by prior empno = mgr
order by levelStart with & Connect by 공부해서 팀장님 답변활용해서
scott/tiger 계정으로 테스트 해봤어요~ㅎ
부모항목이 먼저 나오게 순서대로 나오는게 필요했는데
LEVEL이라는 키워드가 있었군요!!!
팀장님 덕에 Start with & Connect by 와 Level 키워드 공부했심니더~ 감사해용~!!!
Level 키워드 때문에 Lv 컬럼의 의미가 없어지겠네요~ㅎ
p.s : 상품은 담에 맛난 음료 무료 이용!!! (제가 쏠게요~ㅋ)
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
20 | 메모~끄적 | 남송휘 | 2017.09.05 | 7449 |
19 | 안녕하세요 신입입니다. | 엽2님 | 2013.10.02 | 84758 |
18 | 스터디문의 [1] | 쬐끔만더 | 2013.08.06 | 94656 |
17 | 안녕하세요! 신규 가입한 초년차 개발자입니다^^ | JeNus | 2013.07.27 | 93322 |
16 | 안녕하세요 신입 DBA입니다! [1] | 랄랄라 | 2013.07.13 | 89866 |
15 | 스터디 문의 [1] | love123 | 2013.04.22 | 93609 |
14 | 스터디 들고싶어요!!! [1] | 김또깡 | 2013.04.01 | 89775 |
13 | 안녕하세요. 갑인사 예요.. [1] | 조슈아 | 2013.03.18 | 99203 |
12 | 안녕하세요. 가입했습니다. [1] | 수알럽 | 2012.10.17 | 140980 |
11 | 스터디 참여하고싶어요~~~ [1] | 김또깡 | 2012.03.30 | 180013 |
10 | Java 개발자로 일하고 있습니다. [1] | 닻별 | 2012.01.12 | 178119 |
9 | 스터디에 참여하고 싶습니다. ^^ [1] | RAD | 2012.01.11 | 179312 |
8 | 안녕하세요. 이제서야 인사드리네요...^^ [1] | 냐하하하 | 2012.01.05 | 182125 |
7 | 온라인 스터디 가입하고 싶은데.. [1] | 시와처 | 2011.11.28 | 201591 |
6 | 이번에 가입했는데 아직은 어색하네요 ^^ [1] | 싸마군 | 2011.09.07 | 182723 |
5 | 지인의 추천으로 가입했습니다. ^^ [1] | greenips | 2010.12.06 | 200561 |
4 | 11월달 서울에서 offline 모임 일짜 ? [3] | 헌쓰 | 2010.10.30 | 205794 |
3 | 영어 온라인 스터디에 참여하고 싶어요 [1] | hso320 | 2010.10.21 | 207751 |
» | [질문] 트리뷰 노드관련 SQL 처리 [3] | 실천하자 | 2010.03.05 | 164343 |
1 | PHPBB to ZBXE | 휘휘 | 2010.02.21 | 175163 |
무슨 자료 트리 같은거 만드는거 같은데..
단순히 tree 를 위한 table이라면 위에서 처럼 lv컬럼 안써도 될듯...
참고)
CREATE TABLE nodetable (
id varchar2(4) ,
p_id VARCHAR2(4)
);
자료 집어넣고~~~ㅎ
SELECT ROWID,id,p_id,LEVEL-1 lv
FROM nodetable
START WITH id='Root'
CONNECT BY p_id=PRIOR id
ORDER siblings BY id;
쿼리하면 아까 저 table나올끼고...
노드딴데 넣을라면
UPDATE nodetable
SET p_id='Root'
WHERE ROWID='AAAGJWAAIAAEe4KAAK';
걍 p_id만 바까주면 딴데간다는...
rowid 사용한건 걍..내맘..ㅋㅋㅋㅋ update 정확하게 보장.ㅎ
connect by 는 오라클만 데이에에에에에엠..ㅎ~
문제를 제대로 이해했나몰라.ㅋㅋ