当前位置: 首页 > 面试题库 >

Oracle的加(+)表示法和ansi JOIN表示法之间的区别?

寇靖
2023-03-14
问题内容

使用oracle的plus表示法(+)和ansi标准join表示法之间有什么区别?

性能上有区别吗?

加号是否已弃用?


问题答案:

在AFAIK中,该(+)符号仅用于向后兼容,因为Oracle在将ANSI标准用于连接之前就首次使用了该符号。它特定于Oracle,并且当存在等效的符合标准的版本时,应避免在新代码中使用它。

似乎两者之间存在差异,并且该(+)符号具有ANSI连接语法所没有的限制。Oracle自己建议您不要使用该(+)表示法。《Oracle®数据库SQL语言参考11g第1版(11.1)》中的完整说明:

Oracle建议您使用FROM子句OUTER JOIN语法,而不要使用Oracle连接运算符。使用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仅返回简单联接的结果。

在执行多于两对表的外部联接的查询中,单个表可以是仅一个其他表的由null生成的表。因此,您不能将(+)运算符应用于A和B的联接条件以及B和C的联接条件的B列。SELECT有关外部联接的语法,请参见。



 类似资料:
  • 问题内容: 我试图理解和符号之间的区别。在下面的问题中,我使用正确的答案。当我使用它不起作用。有人可以解释为什么与众不同。 问题答案: 使用点表示法时,表示对象中的实际属性,该属性将不存在。因此,返回不等于的。 使用表示法时,您将使用变量中的名称访问对象中的属性。因此,这将起作用。 例如, 这将打印, 因为,没有成员命名(尝试获取名称为的成员),而在下一种情况下,有成员命名为(尝试获取具有in的值

  • 问题内容: 使用和访问数组或对象属性的真正区别是什么?使用哪一个? 另外,为什么运算符不允许索引属性? 问题答案: 使用来访问成员称为 点符号 。用它们访问它们称为 括号符号 。 点表示法仅适用于属性名称即有效标识符名称spec,因此基本上任何名称也将是有效 变量名称 (有效 标识符和任何保留关键字。 [规格]](http://es5.github.io/#x7.6.1) 。 括号表示法需要一个表

  • 问题内容: 我来自Javascript背景(可以同时通过属性和符号访问属性),所以请原谅我,但是Python中两者之间的区别到底是什么? 从我的实验它seeems认为应始终使用,既得到的索引或并从在某个键中获得的价值。这是否正确?如果不正确,什么时候在Python中使用? 问题答案: 点运算符用于访问任何对象的属性。例如,复数 具有(其中包括)两个属性和: 除此以外,它还有一个方法,它也是一个属性

  • 问题内容: 让我们有一个小的数据框: 当我搜索会员资格时,根据我要搜索in还是in的速度差异很大。 这是为什么? 问题答案: 委托给,显然您正在执行索引操作。 另一方面,to的代表必须做一些额外的繁重工作,主要是确定“ CID”是使用属性访问来调用的属性,函数还是列(方便,但不建议用于生产代码)。 现在,为什么不推荐呢?考虑, 将“ A”列称为,没有任何问题,因为它与熊猫中的任何属性或函数命名都不

  • 问题内容: 我有以下Java正则表达式,我没有编写,并且正试图修改: 与此相似。 请注意第一个问号。这是否意味着该组是可选的?对应的后面已经有一个问号。冒号在正则表达式中有特殊含义吗? regex可以很好地编译,并且已经有JUnit测试显示它如何工作。只是我对为什么第一个问号和冒号存在感到有些困惑。 问题答案: 启动一个非捕获组。除非您在使用后从正则表达式中检索组,否则没有什么不同。请参阅什么是非

  • 可以使用符号表示数据库。 在ER图中,有许多符号用于表示基数。 这些符号如下: