1. 조건 정보 테이블에서 relation은 item의 연계정보이고 같이 선택이 됩니다. 연계정보는 단계가 반복 될수 있습니다.
2. Negative는 서로 같이 선택이 되면 안되는 item을 보여줍니다. 그래서 A와 I가 같이 선택이 되면 에러 메시지가 나오게 됩니다.
3. item이 중복으로 나오면 하나만 나오게 합니다.
조건 정보 테이블
item | relation | Negative |
A | D | I |
B | H | |
C | ||
D | F, G | |
E | ||
F | H | |
G | ||
H | ||
I | K | |
J | ||
K | ||
L |
입력 및 출력 테이블
input | output |
A | A, D, F, G, H |
B, F, K | B, H, F, K |
A, C, I | Error |
A, C | A, D, F, G, H, C |
WITH t AS ( SELECT 'A' item, 'D' relation, 'I' Negative FROM dual UNION ALL SELECT 'B', 'H' , '' FROM dual UNION ALL SELECT 'C', '' , '' FROM dual UNION ALL SELECT 'D', 'F, G', '' FROM dual UNION ALL SELECT 'E', '' , '' FROM dual UNION ALL SELECT 'F', 'H' , '' FROM dual UNION ALL SELECT 'G', '' , '' FROM dual UNION ALL SELECT 'H', '' , '' FROM dual UNION ALL SELECT 'I', 'K' , '' FROM dual UNION ALL SELECT 'J', '' , '' FROM dual UNION ALL SELECT 'K', '' , '' FROM dual UNION ALL SELECT 'L', '' , '' FROM dual ) SELECT input_v , CASE WHEN REGEXP_LIKE(item, negative) THEN 'Error' ELSE item END output_v FROM (SELECT input_v , LISTAGG(item, ',') WITHIN GROUP(ORDER BY item) item , LISTAGG(negative, '|') WITHIN GROUP(ORDER BY negative) negative FROM (SELECT DISTINCT input_v, item, negative FROM t -- , (SELECT 'A' input_v FROM dual) , (SELECT 'B,F,K' input_v FROM dual) -- , (SELECT 'A,C,I' input_v FROM dual) -- , (SELECT 'A,C' input_v FROM dual) START WITH INSTR(input_v, item) > 0 CONNECT BY INSTR(PRIOR relation, item) > 0 ) GROUP BY input_v ) ;