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 41072 게시물 읽기
No. 41072
계층형 쿼리에 조건에 다한 출력 질문 ㅠ
작성자
박양희(sadadboy)
작성일
2016-02-11 18:16
조회수
8,571

SELECT '001' id, '초등학교' menuname, '*' 부모id, 'N' 노출YN FROM dual

UNION ALL SELECT '002', '1학년' , '001', 'Y' FROM dual

UNION ALL SELECT '003', '1반' , '002', 'N' FROM dual

UNION ALL SELECT '004', '2반' , '002', 'Y' FROM dual

UNION ALL SELECT '005', '3반' , '002', 'N' FROM dual

UNION ALL SELECT '006', '2학년' , '001', 'N' FROM dual

UNION ALL SELECT '007', '1반' , '006', 'N' FROM dual

UNION ALL SELECT '008', '2반' , '006', 'N' FROM dual

UNION ALL SELECT '009', '3반' , '006', 'Y' FROM dual

UNION ALL SELECT '101', '중학교', '*', 'N' FROM dual

UNION ALL SELECT '102', '1학년' , '101', 'Y' FROM dual

UNION ALL SELECT '103', '1반' , '102', 'Y' FROM dual

UNION ALL SELECT '104', '2반' , '102', 'N' FROM dual

UNION ALL SELECT '105', '3반' , '102', 'N' FROM dual

 

이런 데이터가 있다고 했을때.

노출YN값이 Y인 것만 계층형으로 출력을 하고 싶은데요

 

출력 결과

=========================================

초등학교 - 1학년

초등학교 - 1학년 - 2반

초등학교 - 2학년 - 3반

중학교 - 1학년

중학교 - 1학년 - 1반

=========================================

 

이런식으로

Y값을 가진 데이터 기준으로 부모 데이터까지 노출을 하고자 하는데요

어떻게 조건을 줘야 할지 막막하네요..

부디 답변 부탁드립니다..

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

오라클이 아닌 MSSQL 기준으로 작성되었습니다.

오라클에서는 Connect By 라는게 있다던데 안써봐서 ^^;;

오라클에서도 CTE 는 가능하니 조금 수정하면 사용할수 있지 않을까 싶네요.

구문이 다른건 조금 수정하셔야 할 겁니다.

하기쿼리 참고하세요.

 

---쿼리시작---

;with tblA As
(
SELECT '001' id, '초등학교' menuname, '*' 부모id, 'N' 노출YN FROM tdual
UNION ALL SELECT '002', '1학년' , '001', 'Y' FROM tdual
UNION ALL SELECT '003', '1반' , '002', 'N' FROM tdual
UNION ALL SELECT '004', '2반' , '002', 'Y' FROM tdual
UNION ALL SELECT '005', '3반' , '002', 'N' FROM tdual
UNION ALL SELECT '006', '2학년' , '001', 'N' FROM tdual
UNION ALL SELECT '007', '1반' , '006', 'N' FROM tdual
UNION ALL SELECT '008', '2반' , '006', 'N' FROM tdual
UNION ALL SELECT '009', '3반' , '006', 'Y' FROM tdual
UNION ALL SELECT '101', '중학교', '*', 'N' FROM tdual
UNION ALL SELECT '102', '1학년' , '101', 'Y' FROM tdual
UNION ALL SELECT '103', '1반' , '102', 'Y' FROM tdual
UNION ALL SELECT '104', '2반' , '102', 'N' FROM tdual
UNION ALL SELECT '105', '3반' , '102', 'N' FROM tdual
)
,tblB (id,menuname,부모id,노출YN,leve,serial,sort,item,name) As
(
    Select *
          ,1
          ,CONVERT(varchar(max),'1')
          ,ROW_NUMBER() Over (PARTITION By a.menuname,a.부모id Order By a.menuname,a.부모id,a.id)
          ,a.menuname
          ,Convert(varchar(max),a.menuname)
      From tblA a
     Where a.부모id = '*'
    
 Union All
 
    Select a.id
          ,a.menuname
          ,a.부모id
          ,a.노출YN
          ,b.leve + 1
          ,CONVERT(varchar(max),Convert(varchar(max),b.serial) + Convert(varchar(max),b.leve+1))
          ,ROW_NUMBER() Over (PARTITION By b.item,a.부모id Order By b.item,a.부모id,a.id)
          ,b.item   
          ,Convert(varchar(max),b.name + '-' + a.menuname )    
      From tblA a
                  Inner Join tblB b On a.부모id = b.id
)
,tblC (id,menuname,부모id,노출YN,leve,serial,sort,item,name,seq) As
(
   Select a.*
         ,(
               Case When ISNULL(b.sort,'') = ''
                       Then '1'
                    Else Replicate('1',a.leve -2 ) + Convert(varchar(10),b.sort) + Convert(varchar(10),a.sort)
               End
          )
     From tblB a Left Outer Join tblB b On a.부모id = b.id
)
,tblD (id,menuname,부모id,노출YN,leve,serial,sort,item,name,seq) As
(
    Select a.*
      From tblC a
     Where a.노출YN = 'Y'

 Union All    
 
    Select b.*
      From tblD a
                  Inner Join tblC b On a.부모id = b.id
)
    Select a.id
          ,MAX(a.item)  As item
          ,MAX(a.name)  As name
          ,MAX(a.menuname) As menuname
          ,a.부모id       As 부모id
          ,Max(a.노출YN)  As 노출YN
          ,MAX(a.leve)    As leve
          ,MAX(a.sort)    As seq
          ,a.seq          As serial
      From tblD a
  Group By
           a.id
          ,a.부모id
          ,a.seq
  Order By
           MAX(a.item) asc
          ,a.seq Asc

---쿼리끝---

최한영(terry0515)님이 2016-02-12 09:43에 작성한 댓글입니다.
이 댓글은 2016-02-12 09:47에 마지막으로 수정되었습니다.

SELECT SUBSTR(SYS_CONNECT_BY_PATH(menuname, ' - '), 4) result
  FROM t
 WHERE 노출YN = 'Y'
 START WITH 부모id = '*'
 CONNECT BY PRIOR id = 부모id
;

마농(manon94)님이 2016-02-12 10:12에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41077[질문] 오라클 start with ~ connect by 쿼리문 질문입니다.
김현
2016-02-16
8274
41075시작번호부터 count 숫자만큼 리스트 출력하기.. [3]
임선달
2016-02-12
8847
41073데이터베이스 초보입니다. 공부하는 방법을 알려주시면 감사하겠습니다. [2]
정준모
2016-02-12
8943
41072계층형 쿼리에 조건에 다한 출력 질문 ㅠ [2]
박양희
2016-02-11
8571
41071간단하지만 명확하지 않아서 질문합니다. procedure function package 시에
임경수
2016-02-11
7875
41069안녕하세요 오라클 쿼리 질문 드립니다. [2]
투루로맨스
2016-02-01
8621
41068쿼리 ID가 같으면 값을 SUM 하는 거요. [1]
전설종이
2016-01-30
7976
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.028초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다