database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40691 게시물 읽기
No. 40691
재귀쿼리에서 하위 노드 값을 확인 하는 방법
작성자
임민규(iamwhatiam78)
작성일
2015-01-23 10:21ⓒ
2015-01-23 10:27ⓜ
조회수
9,282

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

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

상황은 아래와 같습니다.

 

- 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'

 

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

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

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

 

 

이 글에 대한 댓글이 총 2건 있습니다.

WITH board AS
(
SELECT 1 myid, null prtid, '부모1' cntn, 'N' del_yn FROM dual
UNION ALL SELECT 2, 1, '자식1'     , 'N' FROM dual
UNION ALL SELECT 3, 2, '자식1-1'   , 'Y' FROM dual
UNION ALL SELECT 4, 1, '자식2'     , 'Y' FROM dual
UNION ALL SELECT 5, 4, '자식2-1'   , 'N' FROM dual
UNION ALL SELECT 6, 5, '자식 2-1-1', 'Y' FROM dual
UNION ALL SELECT 7, 1, '자식3'     , 'Y' FROM dual
UNION ALL SELECT 8, 7, '자식3-1'   , 'Y' FROM dual
UNION ALL SELECT 9, 8, '자식 3-1-1', 'Y' FROM dual
)
SELECT *
  FROM (SELECT *
          FROM board m
         WHERE EXISTS (SELECT *
                         FROM board
                        WHERE del_yn = 'N'
                        START WITH myid = m.myid
                        CONNECT BY PRIOR myid = prtid
                       )
        )
 START WITH prtid IS NULL
 CONNECT BY PRIOR myid = prtid
;

마농(manon94)님이 2015-01-23 17:33에 작성한 댓글입니다.

 아~~~~ 마농님 진심으로 감사드립니다. 왜 저 생각을 못했을까요... ^^

신의 한수 같네요. ^^ 고맙습니다.

임민규(iamwhatiam)님이 2015-01-24 04:43에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40694할인율 적용하는 쿼리짜는 중인데 도와주세요.. [6]
newbie
2015-01-27
11133
40693순차자료에서 구간별 생산량 구하기 [2]
이태우
2015-01-26
7411
40692작업월력 입력 질문좀 드립니다. [5]
궁금이
2015-01-26
7283
40691재귀쿼리에서 하위 노드 값을 확인 하는 방법 [2]
임민규
2015-01-23
9282
40690특정 시간 대역 조회 및 시점 표현에 대한 문의입니다. [2]
김태경
2015-01-23
7443
40689초보의 쿼리 질문 [1]
권사마
2015-01-22
6391
40688조언부탁드립니다. [2]
선이
2015-01-22
6530
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다