연계 및 간섭 정보 확인 0 4 180

by MS [SQL Query] [2018.06.11 10:25:19]


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

 

 

by 마농 [2018.06.11 11:26:07]

A 로 시작하면 D 를 통해 F,G 가 연결되는데
F 에 H 가 연결되고 H 엔 B 가 연결되는데
왜 결과에 H 와 B 가 없는거죠?


by MS [2018.06.11 12:05:15]

미안합니다. 출력 내용이 잘 못되어 있네요.

수정을 했고요. 연결 관계는 순방향만 지원합니다. 즉

A-> D, D->F, G 역 방향은 지원하지 않습니다.

그리고 위 예제에서는 H가 중복되지 않게 되어있는데 출력이 되어도 안되어도 됩니다.


by 마농 [2018.06.11 14:24:22]
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
        )
;

 


by MS [2018.06.12 09:05:08]

감사합니다. 잘 사용하겠습니다.

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