oracle 계층형 쿼리 조언 부탁드립니다 0 3 3,613

by 김상한 [SQL Query] oracle 계층형 [2025.03.05 14:21:16]


안녕하세요. 

계층형 쿼리를 작성 도중 구현하고 싶은 점이 있지만, 여러 방법을 해도 생각한 대로 구현되지 않아 질문 올립니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
WITH T AS
(
    SELECT '학교' CODE_NM, 'SCHOOL1' CODE, NULL PARENT_CODE FROM DUAL
    UNION ALL SELECT '서울학교' CODE_NM, 'SCHOOL3' CODE, 'SCHOOL1' PARENT_CODE FROM DUAL
    UNION ALL SELECT '서울초등학교' CODE_NM, 'SCHOOL4' CODE, 'SCHOOL3' PARENT_CODE FROM DUAL
    UNION ALL SELECT '서울초등학교-1' CODE_NM, 'SCHOOL5' CODE, 'SCHOOL4' PARENT_CODE FROM DUAL
    UNION ALL SELECT '서울초등학교-2' CODE_NM, 'SCHOOL6' CODE, 'SCHOOL4' PARENT_CODE FROM DUAL
    UNION ALL SELECT '서울초등학교-3' CODE_NM, 'SCHOOL7' CODE, 'SCHOOL4' PARENT_CODE FROM DUAL
    UNION ALL SELECT '서울초등학교-4' CODE_NM, 'SCHOOL8' CODE, 'SCHOOL4' PARENT_CODE FROM DUAL
    UNION ALL SELECT '서울초등학교-5' CODE_NM, 'SCHOOL9' CODE, 'SCHOOL4' PARENT_CODE FROM DUAL
    UNION ALL SELECT '학교' CODE_NM, 'SCHOOL2' CODE, NULL PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산학교1' CODE_NM, 'SCHOOL10' CODE, 'SCHOOL2' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산초등학교' CODE_NM, 'SCHOOL11' CODE, 'SCHOOL10' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산초등학교-1' CODE_NM, 'SCHOOL12' CODE, 'SCHOOL11' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산학교2' CODE_NM, 'SCHOOL13' CODE, 'SCHOOL2' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산중학교' CODE_NM, 'SCHOOL14' CODE, 'SCHOOL13' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산중학교-1' CODE_NM, 'SCHOOL15' CODE, 'SCHOOL14' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산중학교-2' CODE_NM, 'SCHOOL16' CODE, 'SCHOOL14' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산중학교-3' CODE_NM, 'SCHOOL17' CODE, 'SCHOOL14' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산고등학교' CODE_NM, 'SCHOOL18' CODE, 'SCHOOL13' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산고등학교-1' CODE_NM, 'SCHOOL19' CODE, 'SCHOOL18' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산고등학교-2' CODE_NM, 'SCHOOL20' CODE, 'SCHOOL18' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산고등학교-3' CODE_NM, 'SCHOOL21' CODE, 'SCHOOL18' PARENT_CODE FROM DUAL
    UNION ALL SELECT '부산고등학교-4' CODE_NM, 'SCHOOL22' CODE, 'SCHOOL18' PARENT_CODE FROM DUAL
)
SELECT
    CODE
    , CODE_NM
    , PARENT_CODE
FROM T

 

위 쿼리에서

 

1
2
3
4
5
START WITH PARENT_CODE IS NULL
 
CONNECT BY PRIOR CODE = PARENT_CODE
 
ORDER SIBLINGS BY CODE

 

로 계층형 쿼리를 사용 중 입니다.

하지만 CODE 가 다르지만 동일한 코드명인 '학교' 가 2 개의 ROW 로 나오는데요,

이와 같은 CODE는 다르지만 코드명이 같은것을 하나의 ROW 로 보여주기 위해 계층형 쿼리를 사용하기 전

 

1
2
3
4
5
6
7
8
9
10
11
SELECT
 
LISTAGG(CODE, ',') CODE
 
, CODE_NM
 
, PARENT_CODE
 
FROM
 
GROUP BY CODE_NM, PARENT_CODE 

 

를 사용하여 나온 결과에 계층형을 적용시키니 CODE 와 PARENT_CODE 가 다르게 나와(코드명이 같은 '학교')

계층형 쿼리가 만들어지지 않습니다.

 

계속 고민하면서 검색도 해봤는데 구현이 되질 않고 있습니다.

어떠한 방법으로 하는게 좋을까요?

by 마농 [2025.03.06 01:23:22]

잘못된 데이터로부터 예외처리를 통해 자료를 뽑는 것 보다는
잘못된 데이터를 바로잡아 예외처리 없이 기본 기능만으로 자료를 뽑는 것을 추천합니다.


by 김상한 [2025.03.06 09:23:55]

ㅠㅠ 답변 감사합니다

아무리 생각해도 다른 코드인데 코드명이 같다고 같은 row 로 나와야 한다는 조건 자체가 이상한데...

오늘도 싸우러 가겠습니다.

 


by 창조의날개 [2025.03.06 14:06:42]
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
      CODE
    , CODE_NM
    , PARENT_CODE
FROM (
        SELECT T.*
             , ROW_NUMBER() OVER(PARTITION BY CODE_NM ORDER BY  CODE) RN
        FROM T)
WHERE RN = 1
START WITH PARENT_CODE IS NULL
CONNECT BY PRIOR CODE = PARENT_CODE
ORDER SIBLINGS BY CODE
;

 

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