1. 기본 형태
select ... <- select할 리스트
from ... <- 테이블
where ... <- 노드에서 체크할 조건
connect by ... <- 노드를 연결하는 조건
start with ... <- 처음 조건
2. Example
트리 구조
( 공백을 나타내기위해 '$'를 사용했습니다. 예를 들어 hani의 부모는 daily입니다. )
my computer -> news -> daily -> chosun
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ -> hani
$$$$$$$$$$$$$$$$$$$$$$ -> sports ->stoo
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ->daily sports
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ->seoul
$$$$$$$$$$$$$ ->cinema -> kino
$$$$$$$$$$$$$$$$$$$$$$$ -> cine21
$$$$$$$$$$$$$ ->freechal
$$$$$$$$$$$$$ ->daum
위와같은 트리 구조는 아래와 같이 테이블로 나타날수 있습니다.
가장 최상위 노드는 pid값을 id값들의 범위 밖의 값으로 지정합니다.
ID NAME URL PID
---------------------------------------
0 my computer NULL -1
1 news NULL 0
2 daily NULL 1
3 sports NULL 1
4 chosun chosun.com 2
5 hani hani.co.kr 2
6 stoo stoo.co.kr 3
7 daily sports hankooki.co.kr 3
8 seoul sportsseoul.co.kr 3
9 cinema NULL 0
10 kino nkino.co.kr 9
11 cine21 cine21.co.kr 9
12 freechal freechal.com 0
13 daum daum.com 0
보시면 알겠지만 각각의 Row에 임의의 키값을 할당하고(여기서는 id) 자신의 부모노드를 가르키는 pid 칼럼을 이용해서 Hierarchical 구조에서 자신의 위치를 나타내는 방법입니다.
일반 쿼리 예)
A. name이 'news'인 것의 바로 아래 노드들을 fetch하기 원할때
select name
from tmpfavorite
where pid = (select id from tmpfavorite where name = 'news')
connect by .. start with 쿼리 예)
A. name 이 'news'인 것의 하위노드들을 모두 fetch하기 원할때
select name, url
from tmpfavorite
connect by prior id = pid
start with name = 'news' ;
* prior는 recusive하게 데이타를 찾는 과정에서 이전 노드를 가르킵니다.
B. name 이 'stoo'인 것의 상위 노드들을 모두 fetch하기 원할때
select name, url
from tmpfavorite
connect by prior pid = id
start with name = 'stoo' ;
C. name 이 'news'인 것의 하위노드들을 중에 url이 'com'으로 끝
나는 것만 fetch하기 원할때
select name, url
from tmpfavorite
where url like '%com'
connect by prior id = pid
start with name = 'news' ;
D. name이 'sports' 인것의 이하 노드들은 빼고 전부 fetch하기 원할때
select name, url
from tmpfavorite
connect by prior id = pid and name <> 'sports'
start with pid = -1;
E. name이 'sports' 인것만 빼고 전부 fetch하기 원할때
select name, url
from tmpfavorite
where name <> 'sports'
connect by prior id = pid
start with pid = -1;
|