IT 개발

[오라클|Oracle] 테이블끼리 조인 걸기 - INNER JOIN, LEFT OUTER JOIN

쭈니루 2014. 7. 4. 07:00
반응형

두 개 이상의 테이블을 하나 이상의 조건을 걸어서 해당된 조건을 가진 값들을 하나의 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    
반응형