FULL OUTER JOIN 문의 드립니다. 0 4 1,010

by 바가지 [SQL Query] [2017.03.20 22:38:11]


서로 같은 키 값(CD, NO)을 가지고 있는 A, B 두개의 테이블들의 중복값을 제거한 전체 집합을 구하려고 합니다.

테이블 A

CD NO
A 01
A 02
B 01
B 02
B 03
C 01
C 02

테이블 B

CD NO
A 01
A 02
B 01
B 02
C 01
C 02
C 03

제가 생각하는 결과

CD NO
A 01
A 02
B 01
B 02
B 03
C 01
C 02
C 03

FULL OUTER JOIN 을 사용하면 될거 같아서 아래와 같이 작성했는데

SELECT A.CD, A.NO
FROM A FULL OUTER JOIN B
ON A.CD = B.CD
AND A.NO = B.NO
ORDER BY A.CD ASC, A.NO ASC;

결과는

CD NO
A 01
A 02
B 01
B 02
B 03
C 01
C 02
NULL NULL

이렇게 나오더라구요..

A 테이블에 값이 없어서 CD : C,  NO : 03 으로 나와야 할 값이 NULL로 나오는거 같은데,

FULL OUTER JOIN이 아닌 A테이블,  B테이블들을 그냥 합쳐 중복값만 제거해야 할까요?

너무 초보적인 질문 같은데 답답해서 문의 드립니다..

by jkson [2017.03.21 07:56:09]
-- select * 해보시면 왜 그렇게 나왔는지 아실 수 있을 겁니다.
-- null 값이 나온 것에 대한 처리는..
SELECT NVL(A.CD,B.CD) CD, NVL(A.NO,B.NO) NO--한 테이블에 중복값이 있을 수 있다면 distinct 처리
FROM A FULL OUTER JOIN B
ON A.CD = B.CD
AND A.NO = B.NO
ORDER BY CD, NO


--a, b테이블에서 중복값 없이 표시하려면 간단하게..
SELECT CD, NO
FROM A
UNION
SELECT CD, NO
FROM B
ORDER BY CD, NO

 


by 바가지 [2017.03.21 11:09:03]

B에 대한 A의 차집합인 부분을 NVL 처리로 해결하면 되는거였네요.

아 정말 감사합니다^^


by 바가지 [2017.03.22 10:15:23]

추가 질문 드립니다.

중복값은 없는데 셀렉트절에 나열되는 컬럼이 많으면 nvl함수말고 union all로 합치는게 성능적으로 좋을거 같은데 제 생각이 맞는건가요?


by 마농 [2017.03.22 10:50:56]

중복값이 없다는 의미가.
두 테이블간 중복값이 전혀 없다는 의미인가요?
그렇다면 굳이 조인을 할 이유가 없죠.
당연히 Union All 을 사용하는게 맞죠.

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