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 와 결과는 동일하다.
우선은 아쉬운대로....