아래 테이블을 내용을 사원정보, 어학점수, 근무평가 조인 하려고 합니다.
어학점수와 근무평가에는 사원정보에 있는 ID 가 없을 수도 있도 중복으로 등록 되기도 합니다.
DB 에서 한번에 조회 하려고 합니다.
물로 union 으로 할 수도 있지만 A table 컬럼이 너무 많고, 그외 많은 테이블과 조인을 해야 하며,
컬럼이 추가시 또 쿼리를 수정 해야 하는 번거로움이 있어 Outer Join 을 사용 하려고 합니다.
A Table(사원정보)
ID Name
1 가
2 나
3 다
4 라
5 마
B Table(어학점수)
ID Score
1 90
1 100
2 30
3 70
3 60
5 60
C Table(근무평가)
1 AAA
1 BBB
4 CCC
5 BBB
5 CCC
원하는 결과
==========================
1 가 1 90 1 AAA
1 가 1 100 1 BBB
2 나 2 30
3 다 3 70
3 다 3 60
4 라 4 CCC
5 마 5 60 5 BBB
5 마 5 CCC
===========================
select * From A left outer join (A.ID = B.ID) 할경우는 잘 나옵니다.
그런데 아래 처럼 하면 데이터가 엄첨 많이 나옵니다.
select * From A
left outer join (A.ID = B.ID)
left outer join (A.ID = C.ID)
with a as ( select '1' id, '가' name from dual union all select '2', '나' from dual union all select '3', '다' from dual union all select '4', '라' from dual union all select '5', '마' from dual ) , b as ( select '1' id, 90 score from dual union all select '1', 100 from dual union all select '2', 30 from dual union all select '3', 70 from dual union all select '3', 60 from dual union all select '5', 60 from dual ) , c as ( select '1' id, 'AAA' grade from dual union all select '1', 'BBB' from dual union all select '4', 'CCC' from dual union all select '5', 'BBB' from dual union all select '5', 'CCC' from dual ) SELECT X.ID, Y.SCORE, Y.GRADE FROM A X LEFT OUTER JOIN ( SELECT NVL(B.ID, C.ID) ID, B.SCORE, C.GRADE FROM (SELECT ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ROWNUM) RNUM, ID, SCORE FROM B) B FULL OUTER JOIN (SELECT ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ROWNUM) RNUM, ID, GRADE FROM C) C ON (B.ID = C.ID AND B.RNUM = C.RNUM) ) Y ON (X.ID = Y.ID) ORDER BY 1,2,3
같은 ID가 중복일 때 차례대로 조인했는데 실제 테이블에서는 다른 기준을 가지고 조인을 해야할 것 같네요.