안녕하세요, 선배님들.
SELECT 절에서 같은 조건을 기준으로 여러 컬럼을 조회하는데요,
해당 쿼리문을 축약할 수 있는 방법이 있을까요?..
기존에 누군가가 작성해둔 SQL 쿼리인데.. 가독성도 떨어지고 쿼리 성능을 향상시킬 수 있는 방법이 있는지 조언을 얻어보고자 합니다!
쿼리는 다음과 같습니다.
SELECT A.COS_INV_SQ, A.COS_INV_QTY, A.COS_INV_GB, A.regDate, Z1.COS_STO_ZO_NM, Z2.COS_STO_NM, IF(A.COS_INV_GB ='품목', (SELECT COS_CLS01_NM FROM COS_CLS01 B2 WHERE B2.COS_CLS01_CD = B1.COS_CLS01_CD), IF(A.COS_INV_GB='원료', (SELECT COS_CLS01_NM FROM COS_CLS01 C2 WHERE C2.COS_CLS01_CD = C1.COS_CLS01_CD), IF(A.COS_INV_GB='부자재', (SELECT COS_CLS01_NM FROM COS_CLS01 D2 WHERE D2.COS_CLS01_CD = D1.COS_CLS01_CD), '' ))) AS COS_CLS01_NM, IF(A.COS_INV_GB='품목', B1.COS_CTRY_NM, IF(A.COS_INV_GB='원료', C1.COS_RAW_MTRL_NM, IF(A.COS_INV_GB='부자재', D1.COS_SUB_RC_NM, '' ))) AS COS_CTRY_NM, IF(A.COS_INV_GB='품목', B1.COS_ITEM_CD, IF(A.COS_INV_GB='원료', C1.COS_RAW_MTRL_CD, IF(A.COS_INV_GB='부자재', D1.COS_SUB_RC_CD, '' ))) AS COS_ITEM_CD, IF(A.COS_INV_GB='품목', B1.COS_USE_FG, IF(A.COS_INV_GB='원료', C1.COS_USE_FG, IF(A.COS_INV_GB='부자재', D1.COS_USE_FG, '' ))) AS COS_USE_FG, Z1.COS_STO_ZO_CD FROM COS_INV A LEFT OUTER JOIN COS_ITEM B1 ON B1.COS_ITEM_CD = A.COS_ITEM_CD LEFT OUTER JOIN COS_RAW_MTRL C1 ON C1.COS_RAW_MTRL_CD = A.COS_RAW_MTRL_CD LEFT OUTER JOIN COS_SUB_RC D1 ON D1.COS_SUB_RC_CD = A.COS_SUB_RC_CD INNER JOIN COS_STO_ZO Z1 ON A.COS_STO_ZO_CD = Z1.COS_STO_ZO_CD INNER JOIN COS_STO Z2 ON Z1.COS_STO_CD = Z2.COS_STO_CD WHERE 1=1 AND A.COS_INV_QTY NOT IN (0) ORDER BY A.COS_INV_SQ DESC LIMIT 0, 20;
품목, 원료, 부자재별로 같은 조건임에도 불구하고 여러 개의 if 함수가 포함되어 있는데,
해당 쿼리의 성능을 향상시킬 수 있는 방법이 있을까요?
답변 미리 감사드립니다. ^^~
SELECT a.cos_inv_sq , a.cos_inv_qty , a.cos_inv_gb , a.regdate , z1.cos_sto_zo_nm , z2.cos_sto_nm , e1.cos_cls01_nm , CASE a.cos_inv_gb WHEN '품목' THEN b1.cos_ctry_nm WHEN '원료' THEN c1.cos_raw_mtrl_nm WHEN '부자재' THEN d1.cos_sub_rc_nm ELSE '' END AS cos_ctry_nm , CASE a.cos_inv_gb WHEN '품목' THEN b1.cos_item_cd WHEN '원료' THEN c1.cos_raw_mtrl_cd WHEN '부자재' THEN d1.cos_sub_rc_cd ELSE '' END AS cos_item_cd , CASE a.cos_inv_gb WHEN '품목' THEN b1.cos_use_fg WHEN '원료' THEN c1.cos_use_fg WHEN '부자재' THEN d1.cos_use_fg ELSE '' END AS cos_use_fg , z1.cos_sto_zo_cd FROM cos_inv a LEFT OUTER JOIN cos_item b1 ON b1.cos_item_cd = a.cos_item_cd LEFT OUTER JOIN cos_raw_mtrl c1 ON c1.cos_raw_mtrl_cd = a.cos_raw_mtrl_cd LEFT OUTER JOIN cos_sub_rc d1 ON d1.cos_sub_rc_cd = a.cos_sub_rc_cd LEFT OUTER JOIN cos_cls01 e1 ON e1.cos_cls01_cd = CASE a.cos_inv_gb WHEN '품목' THEN b1.cos_cls01_cd WHEN '원료' THEN c1.cos_cls01_cd WHEN '부자재' THEN d1.cos_cls01_cd END INNER JOIN cos_sto_zo z1 ON a.cos_sto_zo_cd = z1.cos_sto_zo_cd INNER JOIN cos_sto z2 ON z1.cos_sto_cd = z2.cos_sto_cd WHERE 1=1 AND a.cos_inv_qty NOT IN (0) ORDER BY a.cos_inv_sq DESC LIMIT 0, 20 ;