case when 함수로 변경문의 0 4 705

by 밤나무 [SQL Query] [2017.09.20 14:05:34]


안녕하세요. 한가지 궁금한사항이 있어서 문의 드립니다.

4개의 테이블을 서브쿼리로 조인해서  union all로 가져오는 SQL를 짰는데 비효율이 너무 많아서 문의 드립니다.

거의 비슷한 조건으로 union all하기때문에 case when 함수를 써서 처리할수 있을거 같은데.. 막혀서 진행이 안되네요..

문제의 SQL은 아래와 같습니다.

select a.bubcd, a,sa_no, '2' type
from tka01 a
where a.bub_cd =:001
and a.jindg_typcd in('1','3')
and a.jong_cd is null
and a.jin_cd <> 'A330'
and not exists(select 'Y'
from tka15 c
where c.bub_cd=a.bub_cd
and c.sa_no= a.sa_no
and not exists(select 'Y'
from tka17 b
where b.bub_cd=a.bub_cd
and b.sa_no=a.sa_no
and (a.bub_cd, a.sa_no) in (select d.bub_cd, d.sa_no from tsd01 d
where d.bub_cd=a.bub_cd
and d.sa_no=a.sa_no
and d.sys_cd ='WKA'
and d.sdb_day is not null
and d.sdg_cd is not null

and d.sdm_name like '%신청서본부%')

union all
select a.bubcd, a,sa_no, '3' type
from tka01 a
where a.bub_cd =:001
and a.jindg_typcd ='4'
and a.jong_cd is null
and a.jin_cd <> 'B150'
and not exists(select 'Y'
from tka15 c
where c.bub_cd=a.bub_cd
and c.sa_no= a.sa_no
and not exists(select 'Y'
from tka17 b
where b.bub_cd=a.bub_cd
and b.sa_no=a.sa_no
and (a.bub_cd, a.sa_no) in (select d.bub_cd, d.sa_no from tsd01 d
where d.bub_cd=a.bub_cd
and d.sa_no=a.sa_no
and d.sys_cd ='WKA'
and d.sdb_day is not null
and d.sdm_cd='518'

 

union all하는 테이블은 동일하며 조건이 다른것은 a.jing_typcd , a.jin_cd  부분과 서브쿼리의 in절에 쓰이는 d.sdm_name, sdm_cd만 다릅니다.

그리고 001에 대한 바인드 변수는 동일합니다.그 외의 조건은 동일합니다. case when 함수로 변경해서 하면 SQL 성능 개선이 같은데 어디부분을 수정해야될까요 ? 조언부탁드립니다.

 

by 마농 [2017.09.20 14:33:00]

각 테이블의 키를 알려주세요.


by 밤나무 [2017.09.20 15:25:49]

각 테이블 키는 아래와 같습니다.

TKA01 BUB_CD, SA_NO
TKA15 BUB_CD, SA_NO, BJ_SER
TKA17 BUB_CD, SA_NO, MK_SER, MK_CD
TSD01 BUB_CD, SA_NO, CR_DAY, WOO_NO
 


by 김용한 [2017.09.20 14:53:35]

뒤에 in조건도 틀리고 union all 로 하셔야할듯...


by 마농 [2017.09.20 15:29:03]
SELECT a.bubcd
     , a,sa_no
     , CASE WHEN a.jindg_typcd = '4' THEN '3' ELSE '2' END type
  FROM tka01 a
 WHERE a.bub_cd = :001
   AND a.jindg_typcd IN ('1', '3', '4')
   AND a.jong_cd IS NULL
   AND NOT EXISTS (SELECT 1 FROM tka15 c WHERE c.bub_cd = a.bub_cd AND c.sa_no = a.sa_no)
   AND NOT EXISTS (SELECT 1 FROM tka17 b WHERE b.bub_cd = a.bub_cd AND b.sa_no = a.sa_no)
   AND EXISTS (SELECT 1
                 FROM tsd01 d
                WHERE d.bub_cd = a.bub_cd
                  AND d.sa_no  = a.sa_no
                  AND d.sys_cd = 'WKA'
                  AND d.sdb_day IS NOT NULL
                  AND ( (   a.jindg_typcd IN ('1', '3')     -- 2
                        AND a.jin_cd <> 'A330'              -- 2
                        AND d.sdg_cd IS NOT NULL            -- 2
                        AND d.sdm_name LIKE '%신청서본부%'  -- 2
                        )
                        OR
                        (   a.jindg_typcd = '4'             -- 3
                        AND a.jin_cd <> 'B150'              -- 3
                        AND d.sdm_cd='518'                  -- 3
                        )
                      )
               )
;

 

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