Oracle/SQL2014. 4. 19. 15:26
12.1 버전에서 Native LEFT OUTER JOIN 동작이 개선되었다.


테스트를 위해 아래와 같이 테이블을 생성하자.

-- 1-1
DROP TABLE t1 PURGE;
DROP TABLE t2 PURGE;
DROP TABLE t3 PURGE;

CREATE TABLE t1 AS SELECT LEVEL AS c1 FROM DUAL CONNECT BY LEVEL <= 3;
CREATE TABLE t2 AS SELECT LEVEL AS c1 FROM DUAL CONNECT BY LEVEL <= 2;
CREATE TABLE t3 AS SELECT LEVEL AS c1 FROM DUAL WHERE LEVEL <> 2 CONNECT BY LEVEL <= 3;

-- 1-2
----------
|T1|T2|T3|
----------
| 1| 1| 1|
| 2| 2|  |
| 3|  | 3|
----------

아래 쿼리는 11.2 버전까지는 에러가 발생하지만, 12.1 버전부터 t1, t3 테이블을 카티션 곱한 결과로 t2 테이블을 아우터 조인한다. 일반적으로 사용되는 패턴이 아니기 때문에 실수를 유발할 수 있는 불필요한 개선으로 생각된다.

-- 2-1 : 11.2
SELECT   a.c1 AS ac1, b.c1 AS bc1, c.c1 AS cc1
    FROM t1 a, t2 b, t3 c
   WHERE b.c1(+) = a.c1
     AND c.c1 = b.c1(+)
ORDER BY 1, 3;

ORA-01417: 하나의 테이블은 하나의 다른 테이블과 포괄 조인할 수 있습니다

-- 2-2 : 12.1
SELECT   a.c1 AS ac1, b.c1 AS bc1, c.c1 AS cc1
    FROM t1 a, t2 b, t3 c
   WHERE b.c1(+) = a.c1
     AND c.c1 = b.c1(+)
ORDER BY 1, 3;

AC1 BC1 CC1
--- --- ---
  1   1   1
  1       3
  2       1
  2       3
  3       1
  3       3

6 행이 선택되었습니다.

--------------------------------------
| Id  | Operation             | Name |
--------------------------------------
|   0 | SELECT STATEMENT      |      |
|*  1 |  HASH JOIN OUTER      |      |
|   2 |   MERGE JOIN CARTESIAN|      |
|   3 |    TABLE ACCESS FULL  | T3   |
|   4 |    BUFFER SORT        |      |
|   5 |     TABLE ACCESS FULL | T1   |
|   6 |   TABLE ACCESS FULL   | T2   |
--------------------------------------


'Oracle > SQL' 카테고리의 다른 글

다중 열 다중 행 스칼라 서브 쿼리  (0) 2014.05.14
파티션 확장 절  (0) 2014.05.10
최종 변경 이력 조회  (0) 2014.04.17
SQL ID 생성  (0) 2013.09.24
최종 거래일이 1달 남은 ELW 만기일 조회  (0) 2012.07.12
Posted by 정희락_