I don't have a source for this answer, but in my testing it looks like the (+)
is doing nothing when compared to a literal. The following two queries return the same empty set.
WITH table1 AS
(SELECT LEVEL num_col FROM dual CONNECT BY LEVEL <= 100)
, table2 AS
(SELECT LEVEL * 2 num_col FROM dual CONNECT BY LEVEL <= 50)
SELECT *
FROM table1 a_tab
,table2 b_tab
WHERE b_tab.num_col(+) = 1
ORDER BY 1 DESC;
WITH table1 AS
(SELECT LEVEL num_col FROM dual CONNECT BY LEVEL <= 100)
, table2 AS
(SELECT LEVEL * 2 num_col FROM dual CONNECT BY LEVEL <= 50)
SELECT *
FROM table1 a_tab
,table2 b_tab
WHERE b_tab.num_col = 1
ORDER BY 1 DESC;
However, putting the symbol in a comparison against a column produces the left join as expected
WITH table1 AS
(SELECT LEVEL num_col FROM dual CONNECT BY LEVEL <= 100)
, table2 AS
(SELECT LEVEL * 2 num_col FROM dual CONNECT BY LEVEL <= 50)
SELECT *
FROM table1 a_tab
,table2 b_tab
WHERE b_tab.num_col(+) = a_tab.num_col
ORDER BY 1 DESC;
and putting in a value produces a cross join
WITH table1 AS
(SELECT LEVEL num_col FROM dual CONNECT BY LEVEL <= 100)
, table2 AS
(SELECT LEVEL * 2 num_col FROM dual CONNECT BY LEVEL <= 50)
SELECT *
FROM table1 a_tab
,table2 b_tab
WHERE b_tab.num_col(+) = 2
ORDER BY 1 DESC;
I am working in 11g r2 though, so that may not be the same on your version. I'd say the best solution is to compare data sets to make sure you still return what you expect from the previous query.