TB_CODE 테이블 | |
CODE | VALUE |
SAL01 | 개인 |
SAL02 | 법인 |
SAL03 | 회원 |
TB_SALE 테이블 | |
NAME | MASTER_CODE |
김테스터 | SAL01^SAL02 |
한테스터 | SAL03^SAL02 |
WITH TB_CODE AS(
SELECT ’SAL01’ CODE,’개인’ VALUE FROM DUAL
UNION ALL
SELECT ’SAL02’ CODE,’법인’ VALUE FROM DUAL
UNION ALL
SELECT ’SAL03’ CODE,’회원’ VALUE FROM DUAL
), TB_SALE AS(
SELECT ’김테스터’ NAME,’SAL01^SAL02’ MASTER_CODE FROM DUAL
UNION ALL
SELECT ’한테스터’ NAME,’SAL03^SAL02’ MASTER_CODE FROM DUAL
UNION ALL
SELECT ’호테스터’ NAME,’SAL02^SAL01^SAL03’ MASTER_CODE FROM DUAL
)
SELECT B.NAME,SUBSTR((MAX(SYS_CONNECT_BY_PATH(A.VALUE,’,’))),2) VALUE
FROM TB_CODE A,
(SELECT NAME,M_CODE,ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) RN
FROM (SELECT DISTINCT RN,LEVEL,NAME,
SUBSTR (STR,INSTR (STR, BASE, 1, LEVEL) + LEN,INSTR (STR, BASE, 1, LEVEL + 1)
- INSTR (STR, BASE, 1, LEVEL)- LEN) M_CODE
FROM (SELECT NAME,ROWNUM RN, ’^’ BASE, ’^’ || MASTER_CODE || ’^’ STR,LENGTH (’^’) LEN
FROM TB_SALE)
CONNECT BY LEVEL <=(LENGTH (STR) - LENGTH (REPLACE (STR, BASE)))/ LEN- 1)) B
WHERE A.CODE=B.M_CODE
START WITH RN=1
CONNECT BY PRIOR RN=RN-1
GROUP BY NAME
쿼리 조건: 1. TB_CODE 테이블이 계속 3개 일꺼라는 확신도 없다(계속 늘거나 줄어듬)
2. TB_SALE 테이블의 MASTER_CODE가 1개~ N개로 변할 수도 있다.
위와 같은 조건을 두었을 ㅤㄸㅒㅤ 이렇게 데이터를 풀어서 조인을 한 다음 묶어 주는 형식을 취합니다.
즉, TB_SALE 테이블을 하나 하나 행으로 나눈뒤에... TB_CODE와 조인을 합니다.
그리고 마지막으로 SYS_CONNECT_BY_PATH 로 묶어 주는 방법입니다.
다른 형님들이 더 좋은 의견을 내 주실꺼예요^^; 수고하세욤
결과---------------------------------------
NAME VALUE
---------------- ---------------
김테스터 회원,법인
한테스터 회원,법인
호테스터 회원,법인,회원