Search code examples
sqloraclejoinleft-join

Oracle SQL: How to convert multiple (+) WHERE clauses to LEFT JOINS?


I'm trying to convert some Oracle SQL code to regular SQL and am having trouble with the numerous variables in the SELECT statement, tables in the FROM statement, and (+) WHERE statements.

I have looked through similar posts but all provide simple examples with just 2 variables, 2 tables, and 1 (+) WHERE statement. I'm not sure how to apply what I'm seeing from the other forum posts to multiple variables, tables, and (+) WHERE statements.

SELECT 
    a.ID,
    c.var1,
    d.var2
FROM a, b, c, d, x, y
WHERE a.ID(+) = b.ID
    AND c.var1(+) = b.var1
    AND x.id(+) = y.id;

I tried to convert all the (+) WHERE statements to LEFT JOINs as shown below. I did 3 LEFT JOINS, one for each (+) WHERE statement:

SELECT 
    a.ID,
    c.var1,
    d.var2
FROM a, b, c, d, x, y
WHERE b.ID in 
    (SELECT b.ID
    FROM b
    LEFT JOIN a
    ON a.ID = b.ID)

Solution

  • The query:

    SELECT a.ID,
           c.var1,
           d.var2
    FROM   a, b, c, d, x, y
    

    can be rewritten using ANSI-join syntax as:

    SELECT a.ID,
           c.var1,
           d.var2
    FROM   a
           CROSS JOIN b
           CROSS JOIN c
           CROSS JOIN d
           CROSS JOIN x
           CROSS JOIN y
    

    If you add in the WHERE clause then WHERE c.var1(+) = b.var1 converts the CROSS JOIN to a LEFT OUTER JOIN from b to c. Similarly for the other join conditions.

    Which gives you:

    SELECT a.ID,
           c.var1,
           d.var2
    FROM   b
           LEFT OUTER JOIN a ON a.ID = b.ID
           LEFT OUTER JOIN c ON c.var1 = b.var1
           CROSS JOIN d
           CROSS JOIN y
           LEFT OUTER JOIN x ON x.id = y.id;
    

    fiddle