오라클 집합 연산자에 대해 알아봅시다. 집합 연산자는 UNION ALL(합집합 중복 허용), UNION(합집합), INTERSECT(교집합), 그리고 MINUS(차집합)가 있습니다. 각 집합에 대하여 순서대로 안내해드리겠습니다.
Set Operator 집합 연산자
예시 테이블은 다음과 같습니다.
{TABLEA} A테이블은 [C1], [C2] 두 개의 칼럼으로 이루어져 있고 로우는 (A, B), (B, C), (C, D)가 있습니다.
{TABLEB} B테이블은 [C1], [C2] 두 개의 칼럼으로 이루어져 있고 로우는 (B, B), (B, C), (C, C)가 있습니다.
특징은 (B, C) 로우가 테이블A에도 있고 테이블B에도 있다는 것입니다. 이 부분을 기억해 주시고 진행하겠습니다.
테이블을 구성하고 있는 UNION ALL 은 바로 아래에서 설명드리겠습니다.
WITH TABLEA
AS (SELECT 'A' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'D' FROM DUAL),
TABLEB
AS (SELECT 'B' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'C' FROM DUAL)
SELECT C1, C2 FROM TABLEA
--UNION ALL
--UNION
--INTERSECT
--MINUS
--SELECT C1, C2 FROM TABLEB
UNION ALL 합집합 중복 허용
UNION ALL 은 중복을 허용하는 합집합입니다.
{TABLEA} UNION ALL {TABLEB}는 각 테이블의 모든 로우를 조회합니다.
(B, C) 로우는 테이블 A와 테이블 B에 모두 있으며 조회 결과에서 중복하여 표시가 되는 것을 확인하실 수 있습니다.
WITH TABLEA
AS (SELECT 'A' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'D' FROM DUAL),
TABLEB
AS (SELECT 'B' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'C' FROM DUAL)
SELECT C1, C2 FROM TABLEA
UNION ALL
SELECT C1, C2 FROM TABLEB;
C1 C2
-- --
A B
B C
C D
B B
B C
C C
UNION 합집합
UNION 합집합은 일반적으로 생각할 수 있는 합집합 형태로 중복은 제외를 합니다.
{TABLEA}과 {TABLEB}에 모두 포함되어 있는 로우 (B, C)는 중복을 정리하고 하나만 조회를 합니다.
제외 과정에서 내부 정렬이 이루어집니다.
WITH TABLEA
AS (SELECT 'A' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'D' FROM DUAL),
TABLEB
AS (SELECT 'B' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'C' FROM DUAL)
SELECT C1, C2 FROM TABLEA
UNION
SELECT C1, C2 FROM TABLEB;
C1 C2
-- --
A B
B B
B C
C C
C D
INTERSECT 교집합
INTERSECT 교집합은 두 테이블에 모두 있는 로우를 조회합니다.
(B, C) 로우가 교차하므로 해당 레코드를 조회합니다.
WITH TABLEA
AS (SELECT 'A' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'D' FROM DUAL),
TABLEB
AS (SELECT 'B' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'C' FROM DUAL)
SELECT C1, C2 FROM TABLEA
INTERSECT
SELECT C1, C2 FROM TABLEB;
C1 C2
-- --
B C
MINUS 차집합
MINUS 차집합은 선행 테이블 {TABLEA}에서 후행 테이블 {TABLEB}의 중복(공통) 로우를 제외하여 조회합니다.
즉, 선행 테이블에만 있고 후행 테이블에는 없는 레코드를 조회합니다.
(B, C) 로우는 {TABLEA}, {TABLEB} 모두에 있기에 제외되어 결과가 나옵니다.
WITH TABLEA
AS (SELECT 'A' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'D' FROM DUAL),
TABLEB
AS (SELECT 'B' C1, 'B' C2 FROM DUAL
UNION ALL
SELECT 'B', 'C' FROM DUAL
UNION ALL
SELECT 'C', 'C' FROM DUAL)
SELECT C1, C2 FROM TABLEA
MINUS
SELECT C1, C2 FROM TABLEB;
C1 C2
-- --
A B
C D