CATEGORYID NAME DEPTH
22 업무표준 1
2204 제품 2
2202 공통2 2
2201 공통1 2
220107 안전환경 3
220401 공통 3
220212 안전 3
22010702 (O)안전환경(구) 4
쿼리를 조회하면 위 내용이 나오는데 최종 결과값으로는 아래 내용이 나오길 원합니다
최종 결과물
업무표준
업무표준>제품
업무표준>공통2
업무표준>공통1
업무표준>공통1>안전환경
업무표준>제품>공통
업무표준>공통2>안전
업무표준>공통1>안전환경>(O)안전환경(구)
고수님들 가능할까요?
원본 테이블 그대로 조회한 건가요?
아니면 어떤 가공 과정을 거쳐서 조회한 건가요?
조회 쿼리 보여주세요.
테이블에 3개 항목 외에 다른 항목은 없는지?
조회 쿼리입니다
select categoryid,name, depth from rule_category
where categoryid in ( select distinct categoryid
from rule_document
where locationcode = 'BBAA'
and name LIKE '%의사소통%'
and ref_historyid <> 0
and isdelete = 'n' )
union all
select categoryid,name, depth from rule_category
where categoryid in (select distinct decode(sign(10-length(categoryid)), -1, substr(categoryid, 1, 10), '')
from rule_document
where locationcode = 'BBAA'
and name LIKE '%의사소통%'
and ref_historyid <> 0
and isdelete = 'n')
union all
select categoryid,name, depth from rule_category
where categoryid in (select distinct decode(sign(8-length(categoryid)), -1, substr(categoryid, 1, 8), '')
from rule_document
where locationcode = 'BBAA'
and name LIKE '%의사소통%'
and ref_historyid <> 0
and isdelete = 'n')
union all
select categoryid,name, depth from rule_category
where categoryid in (select distinct decode(sign(6-length(categoryid)), -1, substr(categoryid, 1, 6), '')
from rule_document
where locationcode = 'BBAA'
and name LIKE '%의사소통%'
and ref_historyid <> 0
and isdelete = 'n')
union all
select categoryid,name, depth from rule_category
where categoryid in (select distinct decode(sign(4-length(categoryid)), -1, substr(categoryid, 1, 4), '')
from rule_document
where locationcode = 'BBAA'
and name LIKE '%의사소통%'
and ref_historyid <> 0
and isdelete = 'n')
union all
select categoryid,name, depth from rule_category
where categoryid in (select distinct decode(sign(2-length(categoryid)), -1, substr(categoryid, 1, 2), '')
from rule_document
where locationcode = 'BBAA'
and name LIKE '%의사소통%'
and ref_historyid <> 0
and isdelete = 'n');
원본 쿼리 자체도 비효율이 많네요.
같은 테이블을 너무 여러번 반복해서 사용하고 있네요.
한번만 사용하도록 개선이 필요해 보입니다.
WITH rule_document AS
(
SELECT 'BBAA' locationcode, 1 ref_historyid, 'n' isdelete, '의사소통' name, '22010702' categoryid FROM dual
UNION ALL SELECT 'BBAA', 1, 'n', '의사소통', '220401' FROM dual
UNION ALL SELECT 'BBAA', 1, 'n', '의사소통', '220212' FROM dual
)
, rule_category AS
(
SELECT '22' categoryid, '업무표준' name, 1 depth FROM dual
UNION ALL SELECT '2204' , '제품' , 2 FROM dual
UNION ALL SELECT '2202' , '공통2' , 2 FROM dual
UNION ALL SELECT '2201' , '공통1' , 2 FROM dual
UNION ALL SELECT '220107' , '안전환경' , 3 FROM dual
UNION ALL SELECT '220401' , '공통' , 3 FROM dual
UNION ALL SELECT '220212' , '안전' , 3 FROM dual
UNION ALL SELECT '22010702', '(O)안전환경(구)', 4 FROM dual
)
SELECT SUBSTR(SYS_CONNECT_BY_PATH(name, '>'), 2) x
FROM (SELECT DISTINCT b.categoryid, b.name, b.depth
FROM rule_document a
, rule_category b
WHERE a.locationcode = 'BBAA'
AND a.name LIKE '%의사소통%'
AND a.ref_historyid <> 0
AND a.isdelete = 'n'
-- AND INSTR(a.categoryid, b.categoryid) > 0 -- 조건 수정
AND INSTR(a.categoryid, b.categoryid) = 1
)
START WITH depth = 1
CONNECT BY categoryid LIKE PRIOR categoryid || '__'
ORDER SIBLINGS BY categoryid
;
마농님 감사합니다.
쿼리는 개선해보도록 하겠습니다
이미 개선해 드린 것입니다.
괄호 안의 인라인뷰 쿼리가 원본쿼리 개선한 것입니다.
아 그러네요 근데 나오는 값이 좀 이상하네요.
하늘색 값은 없는 값인데 어디서 나온건지?
22 업무표준 1
40 업무표준 1
107 공통2 표준 1
2201 공통1 2
2202 공통2 2
2204 제품 2
220107 안전환경 3
220212 안전 3
220401 공통 3
22010702 (O)안전환경(구) 4
조건 오류 수정 했습니다.
넵 확인했습니다.
감사합니다
107 은 뭔가요? 다른 코드들과 체계가 다르네요?
2자리씩 이어지는 형태 아닌가요?