SQL(+)=定义和功能

Hen*_*Fok 6 sql oracle outer-join

我想知道SQL中的这个语句实际上是做什么的:

select * 
from table 
where A (+)= B
Run Code Online (Sandbox Code Playgroud)

我反对:

select * 
from table 
where A = B
Run Code Online (Sandbox Code Playgroud)

并看到了差异,但不知道如何形成关于(+)=的功能的解释.在我看来,(+)=告诉它使其满足条件A = B可用,如果组件不可用则忽略/输入为"空".

此外,此语句在create view语句中运行.

提前致谢.

Rah*_*thi 4

(+)= 用于显示OUTER JOINS。它现在不被使用并且现在已被弃用因为它不太可读)。(+) 表示 JOIN 中的“可选”表。另外,我认为这种+表示法只是为了向后兼容而存在,因为 Oracle 在 ANSI 连接标准制定之前就首次使用了它。

另请注意,Oracle 建议您使用 FROM 子句 OUTER JOIN 语法而不是 Oracle 连接运算符。

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

  • 您不能在也包含 FROM 子句连接语法的查询块中指定 (+) 运算符。
  • (+) 运算符只能出现在 WHERE 子句中或 FROM 子句中的左相关上下文(指定 TABLE 子句时)中,并且只能应用于表或视图的列。
  • 如果 A 和 B 通过多个连接条件连接,则必须在所有这些条件中使用 (+) 运算符。如果不这样做,那么 Oracle 数据库将仅返回简单联接产生的行,但不会出现警告或错误来告知您没有外联接的结果。
  • 如果您在外部查询中指定一个表并在内部查询中指定另一个表,则 (+) 运算符不会生成外部联接。
  • 尽管自连接有效,但不能使用 (+) 运算符将表外部连接到自身。例如,以下语句
    无效:
-- The following statement is not valid:
     SELECT employee_id, manager_id 
    FROM employees
    WHERE employees.manager_id(+) = employees.employee_id;
Run Code Online (Sandbox Code Playgroud)

但是,以下自连接是有效的:

   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;
Run Code Online (Sandbox Code Playgroud)
  • (+) 运算符只能应用于列,不能应用于任意表达式。但是,任意表达式可以包含一个或多个用 (+) 运算符标记的列。

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

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

  • 我不喜欢 (+) 语法,但说它已被弃用是不准确的。该语法仍然在几乎所有Oracle生成的SQL语句中使用,它是一些功能所必需的,例如位图连接索引和快速刷新物化视图,并且该语法在12c中进行了扩展以消除一些限制。 (2认同)