본문 바로가기
업무용/오라클

다른테이블 쿼리값 한 row로 합치기 //full outer join

by SEOKIHOUSE 2024. 5. 8.

FULL OUTER JOIN : 두 개의 테이블이 조인이 되면 조인된 데이터는 한 행으로 출력하고, 각 테이블에서 조인되지 않은 데이터는 별도의 새로운 행으로 출력된다. 조인이 되지 않아도 두 개의 테이블 데이터가 모두 조회

 

 

아래에선 rownum을 50으로 맞춰서 괜찮지만 데이터가 다르다면 위처럼 나온다


 

a랑 b테이블 결과값이 있는데 한 row로 합치려면..

rownum으로 값을 줘서 조인후 a.rn = b.rn함

SELECT 
    A.EMPNO,
    A.HDQTS_ORGNM,
    A.DEPT_ORGNM,
    A.DEPTMT_ORGNM,
    A.TEAM_ORGNM,
    B.EMPNO AS EMPNO1,
    B.HDQTS_ORGNM AS HDQTS_ORGNM1,
    B.DEPT_ORGNM AS DEPT_ORGNM1,
    B.DEPTMT_ORGNM AS DEPTMT_ORGNM1,
    B.TEAM_ORGNM AS TEAM_ORGNM1
FROM 
    (
        SELECT 
            EMPNO,
            HDQTS_ORGNM,
            DEPT_ORGNM,
            DEPTMT_ORGNM,
            TEAM_ORGNM,
            ROW_NUMBER() OVER (ORDER BY EMPNO) AS rn
        FROM 
            ${PM}.VW_EMP_ALL
        LEFT JOIN 
            ${PM}.VW_BSCD ON VW_EMP_ALL.ORGCD = VW_BSCD.DEPT_CD
                          AND TO_CHAR(SYSDATE, 'YYYYMMDD') BETWEEN VW_BSCD.USE_BGNG_YMD AND VW_BSCD.USE_END_YMD
        WHERE 
            JNCMP_YMD BETWEEN '20230101' AND '20240501'
            AND ROWNUM <=50
    ) A
FULL OUTER JOIN 
    (
        SELECT 
            EMPNO,
            HDQTS_ORGNM,
            DEPT_ORGNM,
            DEPTMT_ORGNM,
            TEAM_ORGNM,
            ROW_NUMBER() OVER (ORDER BY EMPNO) AS rn
        FROM 
            ${PM}.VW_EMP_ALL
        LEFT JOIN 
            ${PM}.VW_BSCD ON VW_EMP_ALL.ORGCD = VW_BSCD.DEPT_CD
                          AND TO_CHAR(SYSDATE, 'YYYYMMDD') BETWEEN VW_BSCD.USE_BGNG_YMD AND VW_BSCD.USE_END_YMD
        WHERE 
            JNCMP_YMD BETWEEN '20220101' AND '20230501'
            AND ROWNUM <=50
    ) B ON A.rn = B.rn;