Home » SQL & PL/SQL » SQL & PL/SQL » Not Exists vs Left Outer Join with NULL (Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production)
Not Exists vs Left Outer Join with NULL [message #647878] Wed, 10 February 2016 09:52 Go to next message
manubatham20
Messages: 566
Registered: September 2010
Location: Seattle, WA, USA
Senior Member

Hi,

Is there any result difference between not exists vs left outer join with is null condition.

WITH tablea
        AS (SELECT 1 id FROM DUAL
            UNION ALL
            SELECT 2 id FROM DUAL
            UNION ALL
            SELECT 3 id FROM DUAL
            UNION ALL
            SELECT 4 id FROM DUAL),
     tableb
        AS (SELECT 1 id FROM DUAL
            UNION ALL
            SELECT 4 id FROM DUAL)
SELECT *
  FROM tablea a
 WHERE NOT EXISTS
          (SELECT 1
             FROM tableb b
            WHERE a.id = b.id);

WITH tablea
        AS (SELECT 1 id FROM DUAL
            UNION ALL
            SELECT 2 id FROM DUAL
            UNION ALL
            SELECT 3 id FROM DUAL
            UNION ALL
            SELECT 4 id FROM DUAL),
     tableb
        AS (SELECT 1 id FROM DUAL
            UNION ALL
            SELECT 4 id FROM DUAL)
SELECT a.*
  FROM tablea a LEFT OUTER JOIN tableb b ON (a.id = b.id)
 WHERE b.id IS NULL;



Is there any case when they can produce different results. I remember I once saw the difference in results but not able to reconstruct that use case.

Thanks,
Manu
Re: Not Exists vs Left Outer Join with NULL [message #647884 is a reply to message #647878] Wed, 10 February 2016 15:33 Go to previous message
BlackSwan
Messages: 26766
Registered: January 2009
Location: SoCal
Senior Member

SQL> @$HOME/a.sql
SQL> WITH tablea
  2          AS (SELECT 1 id FROM DUAL
  3              UNION ALL
  4              SELECT 2 id FROM DUAL
  5              UNION ALL
  6              SELECT 3 id FROM DUAL
  7              UNION ALL
  8              SELECT 4 id FROM DUAL),
  9       tableb
 10          AS (SELECT 1 id FROM DUAL
 11              UNION ALL
 12              SELECT 4 id FROM DUAL)
 13  SELECT *
 14    FROM tablea a
 15   WHERE NOT EXISTS
 16            (SELECT 1
 17               FROM tableb b
 18              WHERE a.id = b.id);

Execution Plan
----------------------------------------------------------
Plan hash value: 3857091967

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     4 |    24 |    13   (8)| 00:00:01 |
|*  1 |  HASH JOIN ANTI  |      |     4 |    24 |    13   (8)| 00:00:01 |
|   2 |   VIEW           |      |     4 |    12 |     8   (0)| 00:00:01 |
|   3 |    UNION-ALL     |      |       |       |            |          |
|   4 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|   5 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|   6 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|   7 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|   8 |   VIEW           |      |     2 |     6 |     4   (0)| 00:00:01 |
|   9 |    UNION-ALL     |      |       |       |            |          |
|  10 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
|  11 |     FAST DUAL    |      |     1 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("A"."ID"="B"."ID")

SQL> 
SQL> WITH tablea
  2          AS (SELECT 1 id FROM DUAL
  3              UNION ALL
  4              SELECT 2 id FROM DUAL
  5              UNION ALL
  6              SELECT 3 id FROM DUAL
  7              UNION ALL
  8              SELECT 4 id FROM DUAL),
  9       tableb
 10          AS (SELECT 1 id FROM DUAL
 11              UNION ALL
 12              SELECT 4 id FROM DUAL)
 13  SELECT a.*
 14    FROM tablea a LEFT OUTER JOIN tableb b ON (a.id = b.id)
 15   WHERE b.id IS NULL;

Execution Plan
----------------------------------------------------------
Plan hash value: 4127306397

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     4 |    24 |    13   (8)| 00:00:01 |
|*  1 |  FILTER          |      |       |       |            |          |
|*  2 |   HASH JOIN OUTER|      |     4 |    24 |    13   (8)| 00:00:01 |
|   3 |    VIEW          |      |     4 |    12 |     8   (0)| 00:00:01 |
|   4 |     UNION-ALL    |      |       |       |            |          |
|   5 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|   6 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|   7 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|   8 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|   9 |    VIEW          |      |     2 |     6 |     4   (0)| 00:00:01 |
|  10 |     UNION-ALL    |      |       |       |            |          |
|  11 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
|  12 |      FAST DUAL   |      |     1 |       |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("B"."ID" IS NULL)
   2 - access("A"."ID"="B"."ID"(+))

SQL> 


Previous Topic: SQL query help
Next Topic: using case when ..need suggestion
Goto Forum:
  


Current Time: Thu Apr 25 07:46:08 CDT 2024