by 강서꽃미남 [SQL Query] CONNECT BY level 계층구조 [2012.03.12 21:05:39]
SELECT CONNECT_BY_ROOT root_channel , SUBSTR(SYS_CONNECT_BY_PATH(channel, '/'), 2) channels , SUBSTR(SYS_CONNECT_BY_PATH(name, '/'), 2) names , SUBSTR(SYS_CONNECT_BY_PATH('('||channel||')'||name, '/'), 2) channelnames FROM hf_mst_channel WHERE levels = '6' -- 결과조건 START WITH levels = '2' -- 시작조건 CONNECT BY PRIOR channel = parents_cd -- 계층조건 ;
죄송합니다.
답이 늦었습니다.
사진이 안올라가네요.
테이블 현황이 지금
YEAR MONTH CHANNEL PARENTS_CD NAME LEVELS
2012 JAN T CHANNEL 매장 1 -->최상위레벨입니다.
.
.
.
2012 JAN C150 T 직영 2 -->2레벨입니다.
.
.
.
2012 JAN BY01 S631 ~~ 6 -->6레벨입니다.
이런식으로 데이터가 입력되어 있습니다.
보면 2012년 1월부터 12월까지 있는데, 지금 알려고하는것은 2012년 Jan 데이터만 알면됩니다.
그래서 WHERE절 조건에
AND YEAR = '2012'
AND MONTH = 'Jan' 으로 줬습니다.
그래서 마농님께서 짜신 쿼리에 where절 조건 추가했구요,
SELECT
CONNECT_BY_ROOT CHANNEL
, SUBSTR (SYS_CONNECT_BY_PATH (CHANNEL, '^'), 2) CHANNELS
, SUBSTR (SYS_CONNECT_BY_PATH (NAME, '^'), 2) NAMES
, SUBSTR (SYS_CONNECT_BY_PATH ('(' || CHANNEL || ')' || NAME, '^'),2) CHANNE_LNAMES
FROM HF_MST_CHANNEL
WHERE LEVELS = '6' -- 결과조건
START WITH LEVELS = '2' -- 시작조건
CONNECT BY PRIOR CHANNEL = PARENTS_CD -- 계층조건
AND YEAR = '2012'
AND MONTH = 'Jan'
계층조건 추가를 하려다가 어떻게 잡아줘야 할지 모르겠습니다.
내부 루프를 통해서 2레벨부터 6레벨 까지 조인을 해줘야 나오는것인지.
LEVEL2 의 10row,
LEVEL6 의 858row 만 표현되면 됩니다. ==> 12년 Jan이란 조건으로 검색했을 경우의 로우
그런데 위 쿼리되로 돌리면 858 로우만 표시가 되네요..
조건을 어떻게 줘야할지 조언 부탁드립니다.
SELECT CONNECT_BY_ROOT channel root_channel , SUBSTR(SYS_CONNECT_BY_PATH(channel, '/'), 2) channels , SUBSTR(SYS_CONNECT_BY_PATH(name, '/'), 2) names , SUBSTR(SYS_CONNECT_BY_PATH('('||channel||')'||name, '/'), 2) channelnames FROM hf_mst_channel WHERE levels = '6' -- 결과조건 START WITH levels = '2' AND year = '2012' AND month = 'Jan' -- 시작조건 CONNECT BY PRIOR channel = parents_cd AND PRIOR year = year AND PRIOR month = month -- 계층조건 ;
SELECT CONNECT_BY_ROOT CHANNEL ROOT_CHANNEL
, SUBSTR(SYS_CONNECT_BY_PATH(CHANNEL, '^'), 2) CHANNELS
, SUBSTR(SYS_CONNECT_BY_PATH(NAME, '^'), 2) NAMES
, SUBSTR(SYS_CONNECT_BY_PATH('('||CHANNEL||')'||NAME, '^'), 2) CHANNELNAMES
FROM HF_MST_CHANNEL
WHERE LEVELS = '6' -- 결과조건
AND CHANNEL IN ( SELECT CHANNEL
FROM HF_MST_CHANNEL
WHERE YEAR = '2012'
AND MONTH = 'Jan'
AND LEVELS = 6
AND CHANNEL NOT IN ('CST01')
AND SUBSTR (CHANNEL, 1, 1) 'Z')
AND PARENTS_CD NOT IN ('C180', 'C130')
START WITH LEVELS = '2'
AND YEAR = '2012'
AND MONTH = 'Jan' -- 시작조건
CONNECT BY PRIOR CHANNEL = PARENTS_CD
AND PRIOR YEAR = YEAR
AND PRIOR MONTH = MONTH -- 계층조건
로 조건 추가하여 구현 완료했습니다.! 감사합니다 마농님!!
CONNECT BY PRIOR CHANNEL = PARENTS_CD
AND PRIOR YEAR = YEAR
부분이 이해가 어렵지만, 천천히 해나가니 알것도 같습니다. 조건주기가 애매하네요 ~ 감사합니다^^