2. 컴퓨터 이야기/데이타베이스

select .. from .. where .. connect by (prior) .. = (prior) .. start with ..

래빗 크리스 2008. 12. 18. 11:21


가계도를 하나의 DB 테이블에 담았다가 손쉽게 쿼리하여 가져올 수는 없을까..?
분류체계를 정해서 한눈에 보여질 수 있도록 할 수 있지 않을까..?
등등에 대해서 목마름을 씻어주는 쿼리 문법.

일단 오라클에는 있고, MySQL 에는 비슷한 다른 방식이 있다는데..
DB2 나 Sybase 등에는 어떤 것들이 있을까.. 이건 숙제다.

connect by 를 이용하려면 DB 모델링에서 하나의 테이블 안에 트리 구조를 위한 조치를 해야 하는데,
자신의 코드와 트리 구조상 상위 위치의 코드 2개를 가지고 있어야 한다.

이를테면, 아래에 예를든 것에서, w2_category 테이블에는..
자신의 코드인 seq_category 와 상위 코드인 bef_category 를 이용했다.

 select *
    from w2_category
  where bef_category > 0                               -- 인덱스를 태우지 않는 모냥
connect by bef_category = prior seq_category
     start with bef_category = 0
;



만약 아래와 같이 start with 를 사용하지 않는다면..?
어디서 부터 시작해서 트리 구조를 만들어야 할 지 모르기 때문에,
트리 구조가 가능한 모든 조합을 조회하게 된다.

 select *
    from w2_category
  where bef_category > 0
connect by bef_category = prior seq_category
;



그리고, prior 조건의 한쪽에만 사용해야 하는데,
prior 가 붙는 쪽이 트리 구조의 기준이 된다. 

 select *
    from w2_category
  where bef_category > 0
connect by prior bef_category = seq_category
;