database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Tutorials 9442 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 9442
Simple Guide : Hierarchical Queries
작성자
최공훈(ebebe)
작성일
2002-01-11 18:10
조회수
6,520

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;
이 글에 대한 댓글이 총 5건 있습니다.

계층적인 질의는 사실 다른 DBMS 를 이용하던 분들께는 용어자체가 생소할 수 있습니다.

좋은 예제를 들어서 설명해 주신 것 같습니다.

 

저도 도움이 되었습니다. :-)

정재익(advance)님이 2002-01-13 22:53에 작성한 댓글입니다.

pid 는 항상 id 값을 참조하니까

제가 알기로는 최상위 노드의 pid값은

null이어야 알고 있습니다.

 

그래야만 fk의 무결성을 지켜야한다고 합니다.

 

제가 아는 게 맞는 지 아니면 위 상황은 뭔가 다른

특별한 상황인지 궁금합니다.

신성훈님이 2002-01-15 09:53에 작성한 댓글입니다.

최상위 노드의 pid를 null로 두는 것이

logically맞습니다.

근데 현실적으로 root노드에서부터 찾는 경우가 비일비재 합니다.

즉 start with pid is null 인

쿼리의 실행 빈도수가 높다는 겁니다.

일반적으로 말입니다.

따라서 최상위 노드의 pid를 null로 두면

빈도수 많은 쿼리가(start with pid is null )

인덱스를 사용하지 못하는 (그래서 풀스캔하는)

일이 생깁니다.

그래서 위 문제의 쿼리의 인덱스 사용을

위해 trick을 쓰는겁니다. (저는 범위밖의 값으로 두었지요..)

최공훈(ebebe)님이 2002-01-18 11:46에 작성한 댓글입니다.

님 정말 좋은 내용 잘보았습니다.

근데 말입니다...

제가 treefolder를 짜다보니...

^^

계층적으로 가져온 값중에... 하위값이 없는

녀석이 무엇인지를 알아야하거든여

혹 그런 값을 알 순 없을까요?

ex)

아래와 같을 경우,

ccc, ddd, eee, hhhh는 더이상 하위값이 없자나여

그걸 알아낼 순 없을까요

 

aaa

bbbb

cccc

dddd

eeee

ffff

gggg

hhhh

차재춘님이 2002-04-18 14:24에 작성한 댓글입니다.

지송해여

스페이스가 안먹어서 들여쓰기가 안먹는군여

<spe>

aaaa

bbbb

cccc

dddd

eeee

fffff

gggg

hhhh

 

</spe>

차재춘님이 2002-04-18 14:27에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
11046page를 나누기 위한 tip
정재익
2002-06-11
6463
10054libwtc8.so 가 없다고.. 나오는 에러... 해결방법 [1]
우상희
2002-02-28
7245
9754레드햇7.x 혹은 와우7.1 에서의 demo_proc.mk 컴파일 관련 힌트(?) [7]
송호진
2002-02-01
7077
9442Simple Guide : Hierarchical Queries [5]
최공훈
2002-01-11
6520
9414인덱스 분포도에따라 액세스 플랜을 달리하는 SQL문장 [2]
서민구
2002-01-10
5791
9363MANIPULATING LARGE OBJECTS USING DBMS_LOB PACKAGE (2)
정재익
2002-01-07
7887
9362MANIPULATING LARGE OBJECTS USING DBMS_LOB PACKAGE (1)
정재익
2002-01-07
6956
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다