쿼리 좀 만들어 주세요!! 0 9 5,098

by 큐니백작 [SQL Query] [2024.06.12 10:32:16]


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)안전환경(구)
 

고수님들 가능할까요?

by 마농 [2024.06.12 11:27:06]

원본 테이블 그대로 조회한 건가요?
아니면 어떤 가공 과정을 거쳐서 조회한 건가요?
조회 쿼리 보여주세요.
테이블에 3개 항목 외에 다른 항목은 없는지?


by 큐니백작 [2024.06.12 11:52:04]

조회 쿼리입니다


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


by 마농 [2024.06.12 12:51:44]

원본 쿼리 자체도 비효율이 많네요.
같은 테이블을 너무 여러번 반복해서 사용하고 있네요.
한번만 사용하도록 개선이 필요해 보입니다.

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
;

 


by 큐니백작 [2024.06.12 13:10:47]

마농님 감사합니다.

쿼리는 개선해보도록 하겠습니다


by 마농 [2024.06.12 13:20:26]

이미 개선해 드린 것입니다.
괄호 안의 인라인뷰 쿼리가 원본쿼리 개선한 것입니다.


by 큐니백작 [2024.06.12 13:27:23]

아 그러네요 근데 나오는 값이 좀 이상하네요.

하늘색 값은 없는 값인데 어디서 나온건지?

22    업무표준    1
40    업무표준    1
107    공통2 표준    1
2201    공통1    2
2202    공통2    2
2204    제품    2
220107    안전환경    3
220212    안전    3
220401    공통    3
22010702    (O)안전환경(구)    4
 


by 마농 [2024.06.12 13:31:01]

조건 오류 수정 했습니다.


by 큐니백작 [2024.06.12 13:33:06]

넵 확인했습니다.

감사합니다


by 마농 [2024.06.12 13:34:53]

107 은 뭔가요? 다른 코드들과 체계가 다르네요?
2자리씩 이어지는 형태 아닌가요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입