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语句中运行.
提前致谢.
(+)= 用于显示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 比较条件将标有 (+) 运算符的列与表达式进行比较。