outer join 질문요. 0 4 1,633

by 앗싸 [SQL Query] [2017.01.16 17:35:55]


아래 테이블을 내용을 사원정보, 어학점수, 근무평가 조인 하려고 합니다.

어학점수와 근무평가에는 사원정보에 있는 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) 

 

 

by 우리집아찌 [2017.01.16 17:51:19]

outer join 은 중복제거 하려고 쓰지는 않는데요.

원하시는 결과 리스트를 올려주세요. ( 중복시 어느값을 가져올지 , 없으면 어떤표시할지 )

 


by 앗싸 [2017.01.16 18:07:52]

질문 내용 수정 하여 다시 올렸습니다. 감사합니다.


by jkson [2017.01.16 23:26:28]
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가 중복일 때 차례대로 조인했는데 실제 테이블에서는 다른 기준을 가지고 조인을 해야할 것 같네요.


by 앗싸 [2017.01.17 09:56:53]

자세히 알려 주심에 감사합니다. ^^

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