I am checking some old SQL Statements for the purpose of documenting them and probably enhancing them.
The DBMS is Oracle
I did not understand a statement which read like this:
select ...
from a,b
where a.id=b.id(+)
I am confused about the (+)
operator, and could not get it at any forums... (searching for + within quotes didn't work either).
Anyway, I used 'Explain Plan' of SQLDeveloper and I got an output saying that HASH JOIN, RIGHT OUTER
, etc.
Would there be any difference if I remove the (+)
operator at the end of the query? Does the database have to satisfy some condition (like having some indexes, etc.) before (+)
can be used?? It would be greatly helpful if you can provide me a simple understanding, or some good links where I can read about this.
Thanks!
That's Oracle specific notation for an OUTER JOIN, because the ANSI-89 format (using a comma in the FROM clause to separate table references) didn't standardize OUTER joins.
The query would be re-written in ANSI-92 syntax as:
This link is pretty good at explaining the difference between JOINs.
It should also be noted that even though the
(+)
works, Oracle recommends not using it:The (+) operator indicates an outer join. This means that Oracle will still return records from the other side of the join even when there is no match. For example if a and b are emp and dept and you can have employees unassigned to a department then the following statement will return details of all employees whether or not they've been assigned to a department.
So in short, removing the (+) may make a significance difference but you might not notice for a while depending on your data!
In Oracle, (+) denotes the "optional" table in the JOIN. So in your query,
it's a LEFT OUTER JOIN 'b' table with 'a' table. As like modern left join query. ( it will returns all data of 'a' table without loosing its data on the other side optional table 'b' can lost his data )
OR
now if you remove (+) then it will be normal inner join query,
it will only returns all data where both 'a' & 'b' tables 'id' value is same, means common part.
Extra: If you want to make your query as Right join in older format or modern then it will appear as like bellow:
Old:
Modern:
OR
Ref & help:
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187
Left Outer Join using + sign in Oracle 11g
https://www.w3schools.com/sql/sql_join_left.asp
In practice, the + symbol is placed directly in the conditional statement and on the side of the optional table (the one which is allowed to contain empty or null values within the conditional).