full outer join
최종 Group By ~ SUM 하는 방법도 있지만...
애초에 union 없이 한번의 select 로 가능할 것 같습니다.
말도 안되는 from dual 말고 실체를 보여주세요.
전체 쿼리를 적어보고 적어보고 싶은데 보안상 복사가 힘들어서요.. 방법을 찾아서 올려보겠습니다..
쿼리를 그대로 보여주기 힘든거 압니다.
그렇지만 from dual 이나, sum('22') 로 표현하는 것은 실제와 전혀 다른 쿼리죠.
실제 쿼리를 대변할 수 있는 대체쿼리를 보여주시면 됩니다.
예를 들면
위 아래 쿼리가 from 절은 똑같은데 where 절만 달라지는 경우라면 쿼리 한방으로 간단하게 해결됩니다.
-- 원본 쿼리입니다.
SELECT
D2.DPRT_NM
D2.DPRT_CD
D2.DPRT_SRTN_SQNC
SUM(CASE_WHEN NVL(A.COPR_RQPR_ID, '1') != '1' THEN 1 ELSE 0 END) AS RQST_CNT, -- 요청건수
SUM(CASE_WHEN NVL(C.SRTR_EMPY_NO, '1') != '1' THEN 1 ELSE 0 END) AS SPRT_CNT, -- 지원건수
FROM CL_COPR_RQST X A
, CL_COPR_PROS_DPRT_X B
, CM_DPRT_M D
, CM_USR_M E
, CM_DPRT_M F
, CM_EMP_M G
, CM_DPRT_M D1
, CM_DPRT_M D2
, CM_DPRT_M D3
WHERE A.COPR_RQST_SEQ = B.COPR_RQST_SEQ(+)
AND B.COPR_RQST_SEQ = C.COPR_RQST_SEQ(+)
AND B.PROS_DPRT_SEQ = C.PROS_DPRT_SEQ(+)
AND A.COPR_RRQST_DPRT_CD = D.DPRT_CD(+)
AND A.COPR_RQPR_ID = E.USR_ID(+)
AND B.PROS_DPRT_CD = F.DPRT_CD(+)
AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
AND A.COPR_RQST_DPRT_CD = D1.DPRT_CD(+)
AND D1.UPER_DPRT_CD = D2.DPRT_CD(+)
AND D2.UPER_DPRT_CD = D3.DPRT_CD(+)
AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
AND A.COPR_RQST_DPRT_CD IN (SELECT V.DPRT_CD
FROM CM_DPRT_M V
START WITH V.DPRT_CD IN ( SELECT REGEXP_SUBSTR('50000174', '[^,]+',1, LEVEL COL
FROM DUAL CONNECT BY LEVEL <= REGEXP_COUNT('50000174', ',')+1)
CONNECT BY PRIOR V.DPRT_CD = V.UPER_DPRT_CD
)
GROUP BY D2.DPRT_NM, D2.DPRT_CD, D2.DPRT_SRTN_SQNC
-------------------------------------------------------
이걸 쪼개서
SELECT
D2.DPRT_NM
D2.DPRT_CD
D2.DPRT_SRTN_SQNC
SUM(CASE_WHEN NVL(A.COPR_RQPR_ID, '1') != '1' THEN 1 ELSE 0 END) AS RQST_CNT, -- 요청건수
SUM('') AS SPRT_CNT, -- 지원건수
FROM CL_COPR_RQST X A
, CL_COPR_PROS_DPRT_X B
, CM_DPRT_M D
, CM_USR_M E
, CM_DPRT_M F
, CM_EMP_M G
, CM_DPRT_M D1
, CM_DPRT_M D2
, CM_DPRT_M D3
WHERE A.COPR_RQST_SEQ = B.COPR_RQST_SEQ(+)
AND B.COPR_RQST_SEQ = C.COPR_RQST_SEQ(+)
AND B.PROS_DPRT_SEQ = C.PROS_DPRT_SEQ(+)
AND A.COPR_RRQST_DPRT_CD = D.DPRT_CD(+)
AND A.COPR_RQPR_ID = E.USR_ID(+)
AND B.PROS_DPRT_CD = F.DPRT_CD(+)
AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
AND A.COPR_RQST_DPRT_CD = D1.DPRT_CD(+)
AND D1.UPER_DPRT_CD = D2.DPRT_CD(+)
AND D2.UPER_DPRT_CD = D3.DPRT_CD(+)
AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
AND A.COPR_RQST_DPRT_CD IN (SELECT V.DPRT_CD
FROM CM_DPRT_M V
START WITH V.DPRT_CD IN ( SELECT REGEXP_SUBSTR('50000174', '[^,]+',1, LEVEL COL
FROM DUAL CONNECT BY LEVEL <= REGEXP_COUNT('50000174', ',')+1)
CONNECT BY PRIOR V.DPRT_CD = V.UPER_DPRT_CD
)
GROUP BY D2.DPRT_NM, D2.DPRT_CD, D2.DPRT_SRTN_SQNC
UNION
SELECT
D2.DPRT_NM
D2.DPRT_CD
D2.DPRT_SRTN_SQNC
SUM('') AS RQST_CNT, -- 요청건수
SUM(CASE_WHEN NVL(C.SRTR_EMPY_NO, '1') != '1' THEN 1 ELSE 0 END) AS SPRT_CNT, -- 지원건수
FROM CL_COPR_RQST X A
, CL_COPR_PROS_DPRT_X B
, CM_DPRT_M D
, CM_USR_M E
, CM_DPRT_M F
, CM_EMP_M G
, CM_DPRT_M D1
, CM_DPRT_M D2
, CM_DPRT_M D3
WHERE A.COPR_RQST_SEQ = B.COPR_RQST_SEQ(+)
AND B.COPR_RQST_SEQ = C.COPR_RQST_SEQ(+)
AND B.PROS_DPRT_SEQ = C.PROS_DPRT_SEQ(+)
AND A.COPR_RRQST_DPRT_CD = D.DPRT_CD(+)
AND A.COPR_RQPR_ID = E.USR_ID(+)
AND B.PROS_DPRT_CD = F.DPRT_CD(+)
AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
AND B.PROS_DPRT_CD = D1.DPRT_CD(+) -- 이부분 다름.
AND D1.UPER_DPRT_CD = D2.DPRT_CD(+)
AND D2.UPER_DPRT_CD = D3.DPRT_CD(+)
AND C.SRTR_EMPY_NO = G.EMPY_NO(+)
AND B.PROS_DPRT_CD IN (SELECT V.DPRT_CD -- 이부분 다름
FROM CM_DPRT_M V
START WITH V.DPRT_CD IN ( SELECT REGEXP_SUBSTR('50000174', '[^,]+',1, LEVEL COL
FROM DUAL CONNECT BY LEVEL <= REGEXP_COUNT('50000174', ',')+1)
CONNECT BY PRIOR V.DPRT_CD = V.UPER_DPRT_CD
)
AND B.COPR_PRGR_SCD = '4' -- 이부분 다름
GROUP BY D2.DPRT_NM, D2.DPRT_CD, D2.DPRT_SRTN_SQNC
------------------------------------------
이상입니다.
쿼리가 이상하네요.
- 컴마나 괄호등 전반적으로 이상하구요
- From 절에 c 도 안보이구요.
사용되지 않는 테이블은 아예 처음부터 빼는게 어떤지?
- D, E, F, G, D3 는 공통적으로 사용되지 않고 있구요.
- 요청건수를 구할 때 A 만가지고 구하면 될 듯 하구요. (A, D1, D2)
- 지원건수를 구할 때 B 만가지고 구하면 될 듯 하구요. (B, C, D1, D2)
급하게 적느라 c 테이블이 빠진거 같네요..
Union 안쓰고 한쿼리로 가능하시단 말씀이신거죠??
Sum 부분을 해당 테이블로 그냥 select 해서 가져오는게 나을까요???
물론, 한번에도 가능합니다.
다만, 요청부서와 지원부서가 다를 수 있기 때문에 두개 쿼리로 구분짓는게 좋을 듯 하구요.
대신 위에 언급한 쓸데 없는 부분들을 모두 제거하시기 바랍니다.
WITH d0 AS
(
SELECT DISTINCT dprt_cd, uper_dprt_cd
FROM cm_dprt_m v
START WITH dprt_cd IN (SELECT REGEXP_SUBSTR(v_dprt_cd, '[^,]+', 1, LEVEL) COL
FROM (SELECT '50000174' v_dprt_cd FROM dual)
CONNECT BY LEVEL <= REGEXP_COUNT(v_dprt_cd, ',') + 1
)
CONNECT BY PRIOR dprt_cd = uper_dprt_cd
)
SELECT dprt_nm
, dprt_cd
, dprt_srtn_sqnc
, SUM(rqst_cnt) rqst_cnt
, SUM(sprt_cnt) sprt_cnt
FROM (SELECT d2.dprt_nm
, d2.dprt_cd
, d2.dprt_srtn_sqnc
, COUNT(*) rqst_cnt
, 0 sprt_cnt
FROM cl_copr_rqst_x a
, d0
, cm_dprt_m d2
WHERE a.copr_rqst_dprt_cd = d0.dprt_cd
AND d0.uper_dprt_cd = d2.dprt_cd(+)
AND a.copr_rqpr_id != '1'
GROUP BY d2.dprt_nm, d2.dprt_cd, d2.dprt_srtn_sqnc
UNION ALL
SELECT d2.dprt_nm
, d2.dprt_cd
, d2.dprt_srtn_sqnc
, 0 rqst_cnt
, COUNT(*) sprt_cnt
FROM cl_copr_pros_dprt_x b
, ??????????????????? c
, d0
, cm_dprt_m d2
WHERE b.copr_rqst_seq = c.copr_rqst_seq(+)
AND b.pros_dprt_seq = c.pros_dprt_seq(+)
AND b.pros_dprt_cd = d0.dprt_cd
AND d0.uper_dprt_cd = d2.dprt_cd(+)
AND b.copr_prgr_scd = '4'
AND c.srtr_empy_no != '1'
GROUP BY d2.dprt_nm, d2.dprt_cd, d2.dprt_srtn_sqnc
)
GROUP BY dprt_nm, dprt_cd, dprt_srtn_sqnc
;
감사합니다!! 잘해결되었습니다다좋은 하루 보내세요