Enhanced LEFT OUTER JOIN syntax Oracle Database 12C release 1 (12.1)

In 12C LEFT OUTER JOIN is enhanced so a single table can be the null-generated table for multiple tables

In previous releases of Oracle Database, in a query that performed outer joins of more than two pairs of tables, a single table could be the null-generated table for only one other table. Beginning with Oracle Database 12c, a single table can be the null-generated table for multiple tables.

Example

Prepare test data

CREATE TABLE test_tbl1
(id1 NUMBER);

CREATE TABLE test_tbl2
(id1 NUMBER);

CREATE TABLE test_tbl3
(id1 NUMBER);

INSERT INTO test_tbl1 VALUES(1);
INSERT INTO test_tbl1 VALUES(2);
INSERT INTO test_tbl1 VALUES(3);

INSERT INTO test_tbl2 VALUES(2);
INSERT INTO test_tbl2 VALUES(3);
INSERT INTO test_tbl2 VALUES(4);

INSERT INTO test_tbl3 VALUES(3);
INSERT INTO test_tbl3 VALUES(4);
INSERT INTO test_tbl3 VALUES(5);

COMMIT;

SELECT * FROM test_tbl1;

       ID1
----------
         1
         2
         3

SELECT * FROM test_tbl2;

       ID1
----------
         2
         3
         4

SELECT * FROM test_tbl3;

       ID1
----------
         3
         4
         5

and new supported syntax

SELECT a.id1 id1_a, b.id1 id1_b, c.id1 id1_c 
  FROM test_tbl1 a, test_tbl2 b, test_tbl3 c
 WHERE a.id1 = b.id1(+)
   AND c.id1 = b.id1(+)
ORDER BY 1; 

     ID1_A      ID1_B      ID1_C
---------- ---------- ----------
         1                     4
         1                     5
         1                     3
         2                     3
         2                     4
         2                     5
         3                     5
         3          3          3
         3                     4

It’s good to know that tables A, C are joined as CARTESIAN then outer join is used to table B

EXPLAIN PLAN FOR
SELECT a.id1 id1_a, b.id1 id1_b, c.id1 id1_c 
  FROM test_tbl1 a, test_tbl2 b, test_tbl3 c
 WHERE A.id1 = b.id1(+)
   AND c.id1 = b.id1(+)
ORDER BY 1;  

SELECT * 
  FROM TABLE(dbms_xplan.display(null, null, 'BASIC'));

Plan hash value: 1876081838
 
--------------------------------------------
| Id  | Operation              | Name      |
--------------------------------------------
|   0 | SELECT STATEMENT       |           |
|   1 |  SORT ORDER BY         |           |
|   2 |   HASH JOIN OUTER      |           |
|   3 |    MERGE JOIN CARTESIAN|           |
|   4 |     TABLE ACCESS FULL  | TEST_TBL1 |
|   5 |     BUFFER SORT        |           |
|   6 |      TABLE ACCESS FULL | TEST_TBL3 |
|   7 |    TABLE ACCESS FULL   | TEST_TBL2 |
--------------------------------------------

Have a fun 🙂

Tomasz

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.