OUTER조인은 어떤 집합을 기준으로 해서 조인되는 다른 집합과의 연결에 실패했더라도 그 결과를 추출하는 조인을 말한다. 이러한 형태의 조인은 실무에서 자주 등장하기도 하며 그 처리를 위해 우리는 약간의 주의를 기울일 필요가 있다.
아래의 예제는 ANSI SQL OUTER JOIN 비교 예제이다.(Altibase, Oracle)
Altibase iSQL> select A.*, B.*, C.*
from out1B b left outer join out1A a on A.C1 = B.C1 AND A.C2 = B.C2, out1C c
where c.c1 = 11;
Oracle SQL> select A.*, B.*, C.*
from out1A a, out1B b, out1C c
where a.c1(+) = b.c1 AND a.c2(+) = b.c1 and c.c1 = 11;
Altibase iSQL> select A.*, B.*, C.*
from OUT1A A left outer join OUT1B B on B.C1 = A.C1 left outer join out1C c on c.c1 = a.c1;
Oracle SQL> select A.*, B.*, C.*
from out1A a, out1B b, out1C c
where b.c1(+) = a.c1 and c.c1(+) = a.c1;
Altibase iSQL> select k1.*, k2.*, k3.*
from k3 left outer join k1 on k1.c3 = k3.c3 and k1.c4 = k3.c4, k2
where k1.c1 = k2.c1 and k1.c2 = k2.c2 and k1.c1 = 2;
Oracle SQL> select k1.*, k2.*, k3.*
from k1,k2,k3
where k1.c1 = k2.c1 and k1.c2 = k2.c2 and k1.c3(+) = k3.c3 and k1.c4(+) = k3.c4 and k1.c1 = 2;
SELECT X.COL1,X.COL2,X.COL4,Y.COL3
FROM TABLE1 X,TABL2 Y
WHERE X.COL1=Y.COL1
AND X.COL3='B'
AND Y.COL2='2';
SELECT X.COL1,X.COL2,X.COL4,Y.COL3
FROM TABLE1 X,TABL2 Y
WHERE X.COL1=Y.COL1( + )
AND X.COL3='B'
AND Y.COL2='2'
SELECT X.COL1,X.COL2,X.COL4,Y.COL3
FROM TABLE1 X,TABL2 Y
WHERE X.COL1=Y.COL1( + )
AND X.COL3='B'
AND Y.COL2(+)='2';
SELECT X.COL1,X.COL2,X.COL4,Y.COL3
FROM TABLE1 X,TABL2 Y
WHERE X.COL1=Y.COL1( + )
AND X.COL3='B'
AND Y.COL2(+) IN ('1','2');
SELECT X.COL1,X.COL2,X.COL4,Y.COL3
FROM TABLE1 X,TABL2 Y
WHERE X.COL1=Y.COL1( + )
AND X.COL3='B'
AND (Y.COL2='2' OR Y.COL2 IS NULL);
CREATE or REPLACE VIEW VIEW1 AS
SELECT COL1, COL2, COL3
FROM TABLE2
WHERE COL2 IN ('1','2');
SELECT X.COL1, X.COL2, X.COL4, Y.COL3
FROM TABLE1 X, VIEW1 Y
WHERE X.COL1=Y.COL1(+) and X.COL2='B';
SELECT X.COL1, X.COL2, X.COL4, Y.COL3
FROM TABLE1 X, (SELECT COL1, COL3
FROM TABLE2
WHERE COL2 IN ('1','2')) Y
WHERE X.COL1=Y.COL1(+) and X.COL2='B';
SELECT A.부서코드,MIN(A.부서명),C.자재코드,MIN(C.자재명),SUM(D.의뢰수량)
FROM 부서 A,구매의뢰 B,자재 C,구매의뢰자재내역 D
WHERE C.자재구분='소모품'
AND D.자재코드( + )=C.자재코드
AND A.위치='서울'
AND B.부서코드=A.부서코드
AND B.의뢰일자 BETWEEN '19980101' AND '19980131'
AND D.부서코드( + )=B.부서코드
AND D.일련번호( + )=B.일련번호
GROUP BY A.부서코드,C.자재코드
SELECT X.부서코드,MIN(X.부서명),Y.자재코드,MIN(Y.자재명),SUM(X.의뢰수량)
FROM(
SELECT A.부서코드,A.부서명,C.자재코드,C.의뢰수량
FROM 부서 A,구매의뢰 B,구매의뢰자재내역 C
WHERE B.부서코드=A.부서코드
AND C.부서코드=B.부서코드
AND C.일련번호=B.일련번호
AND A.위치='서울'
AND B.의뢰일자 BETWEEN '19980101' AND '19980131'
) X,자재 Y
WHERE Y.자재코드=X.자재코드( + )
AND Y.자재구분='소모품'
GROUP BY X.부서코드,X.자재코드