Oracle 21c부터 SET 연산자 뒤에 ALL 또는 DISTICT 키워드를 지정할 수 있습니다. ALL 키워드를 지정하면 중복을 제거하지 않고, DISTICT 키워드를 지정하면 중복을 제거합니다. 기본값은 DISTICT 키워드입니다. 참고로 EXCEPT 연산자는 MINUS 연산자와 동일하게 동작합니다. 결과적으로 INTERSECT ALL 연산자와 MINUS ALL 연산자가 추가되었습니다.
UNION [ ALL | DISTINCT ]
INTERSECT [ ALL | DISTINCT ]
MINUS [ ALL | DISTINCT ]
EXCEPT [ ALL | DISTINCT ]
테스트를 위해 아래와 같이 테이블을 생성하겠습니다.
-- 1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
CREATE TABLE t1 (c1 NUMBER);
CREATE TABLE t2 (c1 NUMBER);
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (2);
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2);
INSERT INTO t2 VALUES (2);
INSERT INTO t2 VALUES (3);
INSERT INTO t2 VALUES (3);
COMMIT;
아래 쿼리는 INTERSECT ALL 연산자를 사용합니다. 실행 계획 1번에 INTERSECTION ALL HASH 오퍼레이션이 표시됩니다. 이 오퍼레이션은 소트가 아닌 해시 기반으로 동작합니다.
-- 2-1
SELECT * FROM t1 INTERSECT ALL
SELECT * FROM t2;
C1
--
1
2
2
3 행이 선택되었습니다.
------------------------------------------------------------------
| Id | Operation | Name | Starts | A-Rows | Buffers |
------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 0 | 0 | 0 |
| 1 | INTERSECTION ALL HASH| | 1 | 3 | 14 |
| 2 | TABLE ACCESS FULL | T1 | 1 | 6 | 7 |
| 3 | TABLE ACCESS FULL | T2 | 1 | 5 | 7 |
------------------------------------------------------------------
-- 2-2
SELECT * FROM t2 INTERSECT ALL
SELECT * FROM t1;
C1
--
1
2
2
3 행이 선택되었습니다.
아래 쿼리는 MINUS ALL 연산자를 사용합니다. 실행 계획 1번에 MINUS ALL HASH 오퍼레이션이 표시됩니다. 이 오퍼레이션 역시 소트가 아닌 해시 기반으로 동작합니다.
-- 3-1
SELECT * FROM t1 MINUS ALL
SELECT * FROM t2;
C1
--
1
1
2
3 행이 선택되었습니다.
---------------------------------------------------------------
| Id | Operation | Name | Starts | A-Rows | Buffers |
---------------------------------------------------------------
| 0 | SELECT STATEMENT | | 0 | 0 | 0 |
| 1 | MINUS ALL HASH | | 1 | 3 | 14 |
| 2 | TABLE ACCESS FULL| T1 | 1 | 6 | 7 |
| 3 | TABLE ACCESS FULL| T2 | 1 | 5 | 7 |
---------------------------------------------------------------
-- 3-2
SELECT * FROM t2 MINUS ALL
SELECT * FROM t1;
C1
--
3
3
2 행이 선택되었습니다.
관련 링크