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 |