재귀쿼리에서 하위 노드 값을 확인 하는 방법
iamwhatiam 수험생

답변 채택시 : 0코아

답변 2 추천 0 조회 3814 2015.01.23

안녕하세요. 유령 회원처럼 좋은 정보를 받아만 가다가 이렇게 처음 글을 써 봅니다.

다름이 아니라... 게시판을 작성하다가 해결이 안되는 부분이 있어 이렇게 문의 드립니다.

상황은 아래와 같습니다.

 

- MyID : 자신의 키

- PrtID : 부모키

- CNTN : 컨텐츠 제목

- DEL_YN : 삭제 여부

 

이런구조로 테이블을 형성하고 있습니다. 

글을 삭제하게 되면 DEL_YN 값을 Y로 변경하여 숨기는 형태의 게시판 입니다.

단, 삭제된 글 중 하위 노드가 존재하면 "삭제된 글입니다"를 표시하고 하위 노드는 출력을 해줍니다.

하지만 하위 노드도 삭제되 었다면... 즉, 부모와 자식이 모두 삭제된 상태라면 출력이 되지 않아야 합니다.

 

MyID        PrtID      CNTN      DEL_YN

1               null         부모1        N

2                1             자식1       N

3                 2            자식1-1    Y

4                 1             자식2       Y

5                 4             자식2-1    N

6                 5           자식 2-1-1  Y

7                 1           자식3           Y

8                 7           자식3-1       Y

9                 8          자식 3-1-1   Y

 

이런게 되어 있을때... 출력은 아래와 같아야 하는 상황입니다.

 

1   부모1

      2   자식1

4    삭제된글입니다.

      5   자식2-1

 

 

 

3,6,7,8,9 는 출력이 되지 않아야 하는 경우 입니다.

 

SELECT  * FROM(

SELECT MYID, PRTID, CNTN, DEL_YN, CONNECT_BY_ISLEAF AS LEAF

   FROM BOARD

START WITH PRTID IS NULL

CONNECT BY PRIOR MYID = PRTID

) AAA

WHERE AAA.LEAF !=1 OR AAA.DEL_YN !='Y'

 

이렇게 쿼리를 작성하니... 자식이 없으면서 삭제된 경우는 출력되지 않지만,

부모도 삭제되고 자식도 삭제된 경우는 출력이 됩니다.

고수님들의 한수 부탁드립니다. ^^

댓글 (0)
목록 답변등록
재귀쿼리에서 하위 노드 값을 확인 하는 방법
soedari 2015.02.06

하위노드 누적 SUM  이용하시면 될것 같습니다.


SELECT MYID
 , PRTID
    , DECODE(DEL_YN, 'Y', ' 삭제된글입니다.', CNTN) CNTN
    , DEL_YN
FROM (
        SELECT TT.MYID
            , TT.PRTID
            , TT.CNTN
            , TT.DEL_YN
            , ( SELECT SUM(DECODE(DEL_YN, 'N', 1, 0)) CNT
                    FROM BOARD TS
                    START WITH TS.MYID = TT.MYID
                    CONNECT BY PRIOR TS.MYID = ts.PRTID
                )      SUM_CNT            
        FROM BOARD TT
        START WITH TT.PRTID IS NULL
        CONNECT BY PRIOR TT.MYID = TT.PRTID
        )
WHERE SUM_CNT > 0      

댓글 (0)
재귀쿼리에서 하위 노드 값을 확인 하는 방법
stbo 2015.02.06

안녕하세요.


보신 쿼리로 보아 자식의 삭제값을 봐서 부모도 삭제되고 자식도 삭제된 경우는 출력하지 말아야 하지만.

AAA.LEAF <> 1 이 조건 때문에 출력이 되는것이 문제입니다.


테이블 한 번 엑세스로는 안되며 두번 엑세스를 하되

인라인뷰를 써서  PRTID를 기준으로 GROUP BY하여  자식 ID값을 MYID순서로 배열한 후

자식의 기준으로 부모값을 LEAD함수로 뽑아와 해당 인라인 뷰와 BOARD테이블을 조인하여

부모ID, 자식ID 둘다 삭제될 경우 보지 않도록 조건절에 넣어야 합니다.


예) DECODE(부모삭제여부,'Y',자식삭제여부,부모삭제여부) =<> 'Y'

이런식으로 말입니다. 이때 관건이 되는 것이 제일 root의 부모값인데 root값은 null이기 때문에

그 부모의 자식은 삭제되었을  경우 부모값과 상관없이 보여지지 말아야 합니다.

그래서 NULL값을 어떻게 설정할지가 관건입니다.


SELECT

  FROM ( SELECT ....

                    FROM BOARD

                 GROUP BY PRTID, MYID) chd

                ,BOARD prt

WHERE prt.MYID= chd.PRTID

     CONNECT BY ......

DECODE(부모삭제여부,'Y',자식삭제여부,부모삭제여부) =<> 'Y'


위의 형식으로 짜보시는 것을 추천드립니다.


댓글 (0)