오라클 INNER JOIN LEFT OUTER JOIN


두 개 이상의 테이블을 하나 이상의 조건을 걸어서 해당된 조건을 가진 값들을 하나의 ROW로 가져오는 것을 JOIN 이라고 합니다.


JOIN 은 INNER JOIN OUTER JOIN 두 가지로 구분됩니다.

 

SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL;

 

 TO_DAY

 YESTERDAY

 2013/10/29 11:28:54

 2013/10/28 11:28:54


SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL;

 

 TO_DAY

 TOMORROW

 2013/10/29 11:30:10

 2013/10/30 11:30:10

 

이렇게 두 개의 테이블로 설명을 드리겠습니다.

 

 INNER JOIN 이란...

 

조건이 일치하는 값이 두 테이블에 모두 존재할 때 조회되는 것입니다.

 

 

SELECT *
FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A 
       INNER JOIN
      (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B 
       ON A.TO_DAY = B.TO_DAY AND A.YESTERDAY <> B.TOMORROW;

 

 

 TO_DAY

 YESTERDAY

 TO_DAY

 TOMORROW

 2013/10/29 11:32:15

 2013/10/28 11:32:15

 2013/10/29 11:32:15

 2013/10/30 11:32:15


왼쪽 두 컬럼은 A 테이블의 것이고, 오른쪽 두 컬럼은 B 테이블의 것입니다.
A 테이블의 TO_DAY와 B 테이블의 TO_DAY의 값이 같고,
A 테이블의 YESTERDAY 와 B 테이블의 TOMORROW 값이 다른 ROW가 각각 하나씩 있으므로,
두 테이블의 ROW를 하나로 합쳐서 조회하는 것입니다.

 

 

SELECT *
FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A
       INNER JOIN
      (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B
     ON A.YESTERDAY = B.TOMORROW;

 


조회가 하나도 안되는군요.


A 테이블의 YESTERDAY 값과 B 테이블의 TOMORROW 값이 같은 넘이 없기 때문에 JOIN이 걸리지 않을 것입니다.

 

INNER JOIN은 아래와 같은 형태로도 가능합니다.

 

 

SELECT * 
FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A,
      (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B
 WHERE A.TO_DAY = B.TO_DAY
   AND A.YESTERDAY <> B.TOMORROW;

 

 

 TO_DAY

 YESTERDAY

 TO_DAY

 TOMORROW

 2013/10/29 11:32:15

 2013/10/28 11:32:15

 2013/10/29 11:32:15

 2013/10/30 11:32:15

 
테이블을 나열한 후, WHERE 조건절에서 조인 조건을 걸어주시면 되는 겁니다. 


 

 LEFT OUTER JOIN 이란...

 

왼쪽의 테이블은 무조건 조회되며, 오른쪽 테이블에 조건이 맞는 녀석이 있으면.. 같이 보여주는 것입니다.

 

 

SELECT *
FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A
       LEFT OUTER JOIN
      (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B
    ON A.TO_DAY = B.TO_DAY AND A.YESTERDAY <> B.TOMORROW;

 

  

 TO_DAY

 YESTERDAY

 TO_DAY

 TOMORROW

 2013/10/29 11:32:15

 2013/10/28 11:32:15

 2013/10/29 11:32:15

 2013/10/30 11:32:15

 
A 테이블과 B 테이블의 JOIN 조건이 맞는 ROW가 있으므로 합쳐서 보여주는 것입니다.

 

 

SELECT *
FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A
       LEFT OUTER JOIN
      (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B
     ON A.YESTERDAY = B.TOMORROW;

 


 TO_DAY

 YESTERDAY

 TO_DAY

 TOMORROW

 2013/10/29 11:32:15

 2013/10/28 11:32:15

 

 

 

A 테이블의 YESTERDAY 값과 B 테이블의 TOMORROW 값이 같은 넘이 없군요...
A 테이블의 값은 무조건 보여주며, B 테이블의 JOIN 조건을 충족하는 넘이 없어서 NULL로 조회가 되었습니다.

 

이 경우는, 오라클일 경우, 다음과 같은 형태로 가능합니다. 

 

 

SELECT *
FROM (SELECT SYSDATE TO_DAY, SYSDATE - 1 YESTERDAY FROM DUAL) A,
      (SELECT SYSDATE TO_DAY, SYSDATE + 1 TOMORROW FROM DUAL) B
WHERE A.YESTERDAY = B.TOMORROW(+)

 

 

 TO_DAY

 YESTERDAY

 TO_DAY

 TOMORROW

 2013/10/29 11:32:15

 2013/10/28 11:32:15

 

 

 

 

Posted by 쭈니루
TAG

댓글을 달아 주세요

  1. 아우터 조인에서 첫번째 쿼리도 오라클일 경우 보여주신 쿼리같이 그냥 (+) 붙여서 사용가능한가요???
    아님 조건을 두개 줄때는 outer join을 써서 써야되나요?????

    2015.05.31 20:25 신고 [ ADDR : EDIT/ DEL : REPLY ]