使用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.

Sql相关问答推荐

SQL:创建查询以添加减少的总数

PG SQL中按条件聚合值

如何更改函数返回的列名?

LAG函数通过丢弃空值返回前一行

在SQL中将相同且紧挨着的元素进行分组

使用`lag()`获取上一个时间戳

每组显示一行(表1中的分组值),表2中的不同列表用逗号分隔

编写一个SQL查询来返回收视率较高的类型,并取这些收视率的平均值,我该如何做呢?

替换上一个或下一个值中的空值并添加其价格日期

使用多个嵌套数组查询JSON数据

将两列相加为同一表中的行的查询

根据时间、状态和相关行在PostgreSQL中的存在来删除行

将最近的结束日期与开始日期相匹配

SQL 查找 varchar 类型列及其值中多次出现的子字符串

PostgreSQL中如何提取以特定字符开头的字符串中的所有单词?

Clob 问题 - 将 clob 列拆分为多行

如何仅在满足条件时才按顺序在 SQL 中计数?

如何在 RavenDB Studio (RQL) 中插入更新文档

在 Athena / Presto 中提取 JSON 对象以获取动态密钥

将单行中的多个行值转换为列