본문 바로가기
2.2 DB/ORACLE

[Oracle] OUTER JOIN (+)

by Dohi._. 2024. 10. 4.
728x90

조인의 종류

  • INNER JOIN
    • 두 테이블에서 일치하는 행만 반환합니다.
    • JOIN이라고만 쓰면 기본적으로 INNER JOIN으로 해석됩니다.
    • 예: SELECT * FROM A INNER JOIN B ON A.id = B.id
  • OUTER 
    • LEFT JOIN (LEFT OUTER  JOIN)
      • 왼쪽 테이블(A)의 모든 행을 반환하고, 오른쪽 테이블(B)에서 일치하는 행이 없으면 NULL을 반환합니다.
      • 예: SELECT * FROM A LEFT JOIN B ON A.id = B.id
    • RIGHT JOIN (RIGHT OUTER JOIN)
      • 오른쪽 테이블(B)의 모든 행을 반환하고, 왼쪽 테이블(A)에서 일치하는 행이 없으면 NULL을 반환합니다.
      • 예: SELECT * FROM A RIGHT JOIN B ON A.id = B.id
    • FULL JOIN (FULL OUTER JOIN)
      • 두 테이블에서 일치하는 행을 반환하고, 일치하지 않는 경우에는 각각의 테이블에서 NULL을 반환합니다.
      • 예: SELECT * FROM A FULL OUTER JOIN B ON A.id = B.id
  • CROSS JOIN
    • 두 테이블의 모든 조합을 반환합니다. 즉, 각 행이 서로 결합됩니다.
    • 예: SELECT * FROM A CROSS JOIN B
  • SELF JOIN
    • 같은 테이블을 두 번 사용하여 조인하는 방식입니다. 주로 자기 참조 관계를 표현할 때 사용됩니다.
    • 예: SELECT a.*, b.* FROM A a INNER JOIN A b ON a.id = b.parent_id

 


흔하게  일반적으로 Join을 하게 될경우 해당 각 테이블에 해당 데이터가 있는 경우 row 반환하는 INNER Join을 하게됩니다.

즉 교집합과 비슷합니다.

아래 예시를 보면 INNER Join와 결과입니다.

--오라클 조인
SELECT a.id, a.name, b.age
FROM (SELECT 1 AS id, 'dohi' AS name FROM dual
      UNION ALL
      SELECT 2 AS id, 'sohi' AS name FROM dual) a
     ,  (SELECT 1 AS id, 99 AS age FROM dual
      UNION ALL
      SELECT 3 AS id, 99 AS age FROM dual) b
 WHERE a.id = b.id
 --ANSI 
 SELECT a.id, a.name, b.age
FROM (SELECT 1 AS id, 'dohi' AS name FROM dual
      UNION ALL
      SELECT 2 AS id, 'sohi' AS name FROM dual) a
     JOIN  (SELECT 1 AS id, 99 AS age FROM dual
      UNION ALL
      SELECT 3 AS id, 99 AS age FROM dual) b
ON a.id = b.id

 

결과 (INNER JOIN) 

 

 

 


OUTER JOIN의 경우는 지정하는 테이블의 모든 Row는 반환합니다 

즉 지정하는 테이블에 추가적인 정보가 있으면 보여주고 없으면 NULL 으로 생각하면 편합니다.

 

지금 아래코드는  오라클의 Left Outer Join입니다

-- oracle 
SELECT a.id, a.name, b.age
FROM (SELECT 1 AS id, 'dohi' AS name FROM dual
      UNION ALL
      SELECT 2 AS id, 'sohi' AS name FROM dual) a
     , (SELECT 1 AS id, 99 AS age FROM dual
      UNION ALL
      SELECT 3 AS id, 99 AS age FROM dual) b
 WHERE a.id = b.id(+)
 -- ANSI 
 SELECT a.id, a.name, b.age
FROM (SELECT 1 AS id, 'dohi' AS name FROM dual
      UNION ALL
      SELECT 2 AS id, 'sohi' AS name FROM dual) a
LEFT OUTER JOIN
      (SELECT 1 AS id, 99 AS age FROM dual
      UNION ALL
      SELECT 3 AS id, 99 AS age FROM dual) b
ON a.id = b.id;

 

결과( Left Outer Join)

 

오라클의 경우는 Where에서 (+) 를 붙이는곳이 추가 정보라고 생각하면 편합니다 

LEFT OUTER JOIN의 경우 왼쪽에 붙은 테이블을 지정한 테이블로 하고

오른쪽에 있는 테이블은 추가 테이블로 봅니다.

 

RIGHT OUTER JOIN도 동일하게 지정테이블이 오른쪽(나이)테이블로 바뀌는 것 입니다

결과를 한번 확인해보겠습니다.

-- oracle 
SELECT a.id, a.name, b.age
FROM (SELECT 1 AS id, 'dohi' AS name FROM dual
      UNION ALL
      SELECT 2 AS id, 'sohi' AS name FROM dual) a
     , (SELECT 1 AS id, 99 AS age FROM dual
      UNION ALL
      SELECT 3 AS id, 99 AS age FROM dual) b
 WHERE a.id(+) = b.id
 -- ANSI 
 SELECT a.id, a.name, b.age
FROM (SELECT 1 AS id, 'dohi' AS name FROM dual
      UNION ALL
      SELECT 2 AS id, 'sohi' AS name FROM dual) a
 RIGHT OUTER JOIN
      (SELECT 1 AS id, 99 AS age FROM dual
      UNION ALL
      SELECT 3 AS id, 99 AS age FROM dual) b
ON a.id = b.id;

결과( RIGHT OUTER JOIN)

나이가 있는 오른쪽 테이블이 지정테이블이기 때문에 id 3의 99가 출력되게 됩니다.

 

FULL OUTER JOIN의 경우는 모든 테이블이 지정된 테이블이기에 

모든 정보가 보여야합니다.

합집합으로 생각하면 편합니다 

SELECT a.id, a.name, b.id, b.age
FROM (SELECT 1 AS id, 'dohi' AS name FROM dual
      UNION ALL
      SELECT 2 AS id, 'sohi' AS name FROM dual) a
FULL OUTER JOIN
      (SELECT 1 AS id, 99 AS age FROM dual
      UNION ALL
      SELECT 3 AS id, 99 AS age FROM dual) b
ON a.id = b.id
order by 1;

 

결과( FULL OUTER JOIN)

보기 편하게 일단 order by 1; 을 주었습니다 a테이블의 id값으러 정렬이 되었고 b테이블의 id 3은 a에서는 없지만 지정테이블이기 때문에 값이 나오는 것을 알 수 있습니다.

 

 

 

 


여기서 궁금한점

왜 FULL 에서는 oracle 방식인 (+)이 없어요?

 

실제로 한번 돌려보겠습니다.

SELECT a.id, a.name, b.age
FROM (SELECT 1 AS id, 'dohi' AS name FROM dual
      UNION ALL
      SELECT 2 AS id, 'sohi' AS name FROM dual) a
     , (SELECT 1 AS id, 99 AS age FROM dual
      UNION ALL
      SELECT 3 AS id, 99 AS age FROM dual) b
 WHERE a.id (+)= b.id(+)

 

ORA-01468오류

Oracle 문법에서 OUTER JOIN은 LEFT/ RIGHT JOIN만 지원하고 FULL JOIN을 지원하지 않기때문에

ANSI 문법으로 OUTTER JOIN 진행을 해야합니다

 

 

728x90

댓글