【问题标题】:SQL (+)= definition and functionSQL (+)= 定义和函数
【发布时间】:2014-03-25 18:00:25
【问题描述】:

我想知道 SQL 中这条语句的实际作用:

select * 
from table 
where A (+)= B

我反对:

select * 
from table 
where A = B

看到了区别,但不知道如何解释 (+)= 的功能是什么。在我看来, (+)= 告诉它在可用的情况下满足条件 A = B ,如果组件不可用,则忽略/输入为“空”。

此外,此语句在创建视图语句中运行。

提前致谢。

【问题讨论】:

标签: sql oracle outer-join


【解决方案1】:

(+)= 用于显示 OUTER JOINS。它现在不使用,现在已弃用因为它的可读性不是很高)。 (+) 表示 JOIN 中的“可选”表。此外,我认为+ 表示法只是为了向后兼容而存在,因为 Oracle 在 ANSI 连接标准实施之前就推出了它。

Also note that Oracle recommends that you use the FROM clause OUTER JOIN syntax rather than the Oracle join operator.

使用 Oracle 连接运算符 (+) 的外连接查询是主题 以下规则和限制,不适用于 FROM 子句 OUTER JOIN 语法:

  • 您不能在还包含 FROM 子句连接语法的查询块中指定 (+) 运算符。
  • (+) 运算符只能出现在 WHERE 子句中,或者在左相关上下文中(指定 TABLE 子句时) FROM 子句,并且只能应用于表或视图的列。
  • 如果 A 和 B 通过多个连接条件连接,则必须在所有这些条件中使用 (+) 运算符。如果你不, 那么 Oracle 数据库将只返回由 简单加入,但没有警告或错误提示您 没有外连接的结果。
  • 如果您在外部查询中指定一个表而在内部查询中指定另一个表,则 (+) 运算符不会生成外部联接。
  • 您不能使用 (+) 运算符将表外连接到自身,尽管自连接是有效的。例如下面的语句
    无效:
-- The following statement is not valid:
     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
    ORDER BY e1.employee_id, e1.manager_id, e2.employee_id;
  • (+) 运算符只能应用于列,不能应用于任意表达式。但是,任意表达式可以包含 一列或多列标有 (+) 运算符。

  • 包含 (+) 运算符的 WHERE 条件不能与使用 OR 逻辑运算符的另一个条件组合。

  • WHERE 条件不能使用 IN 比较条件将标有 (+) 运算符的列与表达式进行比较。

【讨论】:

  • 所以理论上可以这样分组? A(+) = B .. 所以这在逻辑上与 B = A(+) 相同?
  • 我不喜欢 (+) 语法,但说它已被弃用并不准确。几乎所有 Oracle 生成的 SQL 语句中仍然使用该语法,位图连接索引和快速刷新物化视图等一些功能需要它,并且在 12c 中扩展了该语法以消除一些限制。
  • @jonearles:- 是的,我同意它没有被弃用,但我只是写了它,因为 Oracle 也不建议使用它。如果它造成一些麻烦,我应该删除不推荐使用的词吗?
  • 这是一个艰难的决定,这取决于观众。对刚接触 Oracle 的人说这句话很有用。但你不会想对经验丰富的 Oracle 开发人员这么说,因为这在技术上是错误的。
  • @jonearles:- 是的,这就是我在说弃用时在括号中提到原因的原因! ;)
【解决方案2】:

在此处查看 oracle 文档:http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm

(向下到外部连接)

外连接扩展了简单连接的结果。外连接 返回满足连接条件的所有行并返回一些 或一个表中没有其他行的所有行 满足连接条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2011-07-28
    • 2012-07-25
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多