본문 바로가기

Dev::DB/Oracle

START WITH ~ CONNECT BY ~ 에서 말단 Leaf



Start With ~ Connect By ~ 를 어느정도 사용


하다보니 나오는 데이터의 Tree 구조에서 Leaf 를 찾아야 하는 하는 경우가 있었다.


10g 이상에서는 


CONNECT_BY_ROOT 

SYS_CONNECT_BY_PATH

CONNECT_BY_ISLEAF


라는 것을 제공하여 


SELECT LPAD(LEVEL, LEVEL*3) AS TREE, A.* , CONNECT_BY_ISLEAF AS IsLeaf

       FROM TreeTable A 

      START WITH A.PCODE = '@'AND USEFLAG = '1'

   CONNECT BY A.PCODE = PRIOR A.CODE AND USEFLAG = '1'

     ORDER SIBLINGS BY DISPSEQ ASC 



CONNECT_BY_ISLEAF  를 통해서 1 이면 말단 노드 인것을 알 수 있다.


하지만 9i 에서 사용가능한 쿼리 필요했었기 때문에...

저 단순하고 좋은 기능을 사용할 수 가 없어서 부득이 하게 마~니~ 복잡하게 돌아가기로 했다.



SELECT LPAD(LEVEL, LEVEL*3) AS TREE, A.* , 

            CONNECT_BY_ISLEAF AS IsLeaf_A,

            DECODE

             ((SELECT DISTINCT '1'

                  FROM TreeTable

                WHERE USEFLAG = '1' 

                START WITH PCODE = A.CODE CONNECT BY PCODE = PRIOR CODE)

               , NULL, 1, 0) AS IsLeaf_B 

       FROM TreeTable A 

      START WITH A.PCODE = '@'AND USEFLAG = '1'

   CONNECT BY A.PCODE = PRIOR A.CODE AND USEFLAG = '1'

     ORDER SIBLINGS BY DISPSEQ ASC 




이전에 비해서 굉장히 복잡해지고 효율도 굉장히 나빠졌다.(더 좋은 방법 모색이 필요하긴 하다...ㅡㅡ;)

하지만 

CONNECT_BY_ISLEAF  인 IsLeaf_A 와 복잡한 서브쿼리를 통한 IsLeaf_B 와 결과는 동일하다.

우선은 아쉬운대로....






'Dev::DB > Oracle' 카테고리의 다른 글

ODP.NET 에서 Parameter 사용할 때....  (0) 2014.11.26
분할 조회 쿼리  (0) 2013.12.03
달력 SQL  (0) 2011.03.17
Oracle 계층적 트리구조 START WITH ~ CONNECT BY ~ ORDER SIBLINGS BY  (0) 2010.01.18
ROW 를 COL 으로 변환  (0) 2009.07.30