Oracle “(+)” Operator

前端 未结 4 566
礼貌的吻别
礼貌的吻别 2020-11-22 11:56

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 wh

相关标签:
4条回答
  • 2020-11-22 12:31

    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:

       SELECT ...
         FROM a
    LEFT JOIN b ON b.id = a.id
    

    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:

    Oracle recommends that you use the FROM clause OUTER JOIN syntax rather than the Oracle join operator. Outer join queries that use the Oracle join operator (+) are subject to the following rules and restrictions, which do not apply to the FROM clause OUTER JOIN syntax:

    0 讨论(0)
  • 2020-11-22 12:37

    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).

    0 讨论(0)
  • 2020-11-22 12:39

    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.

    select * from emp, dept where emp.dept_id=dept.dept_id(+)
    

    So in short, removing the (+) may make a significance difference but you might not notice for a while depending on your data!

    0 讨论(0)
  • 2020-11-22 12:47

    In Oracle, (+) denotes the "optional" table in the JOIN. So in your query,

    SELECT a.id, b.id, a.col_2, b.col_2, ...
    FROM a,b
    WHERE a.id=b.id(+)
    

    it's a LEFT OUTER JOIN of table 'b' to table 'a'. It will return all data of table 'a' without losing its data when the other side (optional table 'b') has no data.

    The modern standard syntax for the same query would be

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    LEFT JOIN b ON a.id=b.id
    

    or with a shorthand for a.id=b.id (not supported by all databases):

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    LEFT JOIN b USING(id)
    

    If you remove (+) then it will be normal inner join query

    Older syntax, in both Oracle and other databases:

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a,b
    WHERE a.id=b.id
    

    More modern syntax:

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    INNER JOIN b ON a.id=b.id
    

    Or simply:

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    JOIN b ON a.id=b.id
    

    It will only return all data where both 'a' & 'b' tables 'id' value is same, means common part.

    If you want to make your query a Right Join

    This is just the same as a LEFT JOIN, but switches which table is optional.

    Old Oracle syntax:

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a,b
    WHERE a.id(+)=b.id
    

    Modern standard syntax:

    SELECT  a.id, b.id, a.col_2, b.col_2, ...
    FROM a
    RIGHT JOIN b ON a.id=b.id
    

    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

    0 讨论(0)
提交回复
热议问题