contrib 안에 보면, tablefunc 모듈이 있습니다. 이 모듈을 설치하면, connectby 함수가 설치되는데, 이놈이 오라클의 connect by 구문 비슷한 기능을 하네요.
그래서 간단하게 언급합니다.
template1=# select * from treetable;
num | upper | name
-----+-------+--------
1 | 0 | 락
2 | 0 | 재즈
3 | 0 | 힙합
4 | 0 | 알앤비
5 | 1 | 하드락
6 | 1 | 락앤롤
7 | 2 | 빅밴드
8 | 2 | 비밥
(8 rows)
이런 자료에서
template1=# select num, depth, pos
from connectby ('treetable','num','upper','num','0',0)
as t (num int, upper int, depth int, pos int);
num | depth | pos
-----+-------+-----
0 | 0 | 1
1 | 1 | 2
5 | 2 | 3
6 | 2 | 4
2 | 1 | 5
7 | 2 | 6
8 | 2 | 7
3 | 1 | 8
4 | 1 | 9
(9 rows)
이런 형태로 select 할 수 있습니다.
이것을 다시 원본 테이블과 조인을 하면,
template1=# select b.pos, a.num, repeat(' ', b.depth - 1) || a.name
from treetable a,
(select num, depth, pos
from connectby ('treetable','num','upper','num','0',0)
as t (num int, upper int, depth int, pos int)) b
where a.num > 0 and a.num = b.num order by b.pos;
pos | num | ?column?
-----+-----+--------------
2 | 1 | 락
3 | 5 | 하드락
4 | 6 | 락앤롤
5 | 2 | 재즈
6 | 7 | 빅밴드
7 | 8 | 비밥
8 | 3 | 힙합
9 | 4 | 알앤비
(8 rows)
이렇게 만들어집니다.
오라클 만큼 깔끔하지는 못하지만, 그럭 저럭 필요할 때 유용하게 써 먹을 수 있겠네요. 특히 오라클 쪽에서 이쪽으로 옮겨야할 상황에서는 유용할 듯.
|