使用oracle的plus表示法(+)
与ansi标准join
表示法有什么区别?
性能有差异吗?
加号符号是否已被弃用?
使用oracle的plus表示法(+)
与ansi标准join
表示法有什么区别?
性能有差异吗?
加号符号是否已被弃用?
顺便说一句,(+)
符号的出现只是为了向后兼容,因为Oracle在ANSI连接标准出台之前就推出了它.它是针对Oracle的,如果有符合标准的等效版本可用,您应该避免在新代码中使用它.
It seems there are differences between the two, and the 101 notation has restrictions that the ANSI join syntax does not have. Oracle themselves recommend that you not use the 101 notation. Full description here in the 100:
Oracle建议您使用
FROM
子句OUTER JOIN
语法,而不是Oracle join运算符.使用Oracle联接运算符(+)
的外部联接查询受以下规则和限制的约束,这些规则和限制不适用于FROM
子句OUTER JOIN
语法:
- 不能在也包含
FROM
子句联接语法的查询块中指定(+)
运算符.(+)
运算符只能出现在WHERE
子句中,或者在左相关上下文中(指定TABLE
子句时)出现在FROM
子句中,并且只能应用于表或视图的一列.- 如果A和B由多个联接条件联接,则必须在所有这些条件中使用
(+)
运算符.如果不返回,则Oracle数据库将只返回简单联接产生的行,但不会出现警告或错误,提示您没有外部联接的结果.- 如果在外部查询中指定一个表,在内部查询中指定另一个表,则
(+)
运算符不会生成外部联接.- 不能使用
(+)
运算符将表外部联接到自身,尽管自联接是有效的.例如,以下语句无效:
SELECT employee_id, manager_id FROM employees WHERE employees.manager_id(+) = employees.employee_id;
但是,以下自联接是有效的:
SELECT e1.employee_id, e1.manager_id, e2.employee_id FROM employees e1, employees e2 WHERE e1.manager_id(+) = e2.employee_id;
(+)
运算符只能应用于列,不能应用于任意表达式.但是,任意表达式可以包含一个或多个标有(+)
运算符的列.- 包含
(+)
运算符的WHERE
条件不能与使用OR
逻辑运算符的其他条件组合.WHERE
条件不能使用IN
比较条件将标有(+)
运算符的列与表达式进行比较.如果
WHERE
子句包含将表B中的一列与常数进行比较的条件,则必须对该列应用(+)
运算符,以便Oracle返回表a中为该列生成空值的行.否则,Oracle只返回简单联接的结果.在对两对以上的表执行外部联接的查询中,一个表可以是仅为另一个表生成的空表.因此,不能将
(+)
运算符应用于A和B的联接条件中的B列,以及B和C的联接条件中的B列.有关外部联接的语法,请参阅SELECT
.