我正在检查一些旧的 SQL 语句,以便记录它们并可能增强它们。
DBMS 是甲骨文
我不明白这样的声明:
select ...
from a,b
where a.id=b.id(+)
我对 (+)
运算符感到困惑,并且无法在任何论坛上获得它......(在引号内搜索 + 也不起作用)。
无论如何,我使用了 SQLDeveloper 的“解释计划”,我得到一个输出说 HASH JOIN, RIGHT OUTER
等。
如果我在查询末尾删除 (+)
运算符,会有什么不同吗?在使用 (+)
之前,数据库是否必须满足某些条件(例如具有某些索引等)?如果您能给我提供一个简单的理解,或者提供一些我可以阅读相关内容的好链接,那将非常有帮助。
谢谢!
这是 OUTER JOIN 的 Oracle 特定表示法,因为 ANSI-89 格式(在 FROM 子句中使用逗号分隔表引用)没有标准化 OUTER 连接。
查询将以 ANSI-92 语法重写为:
SELECT ...
FROM a
LEFT JOIN b ON b.id = a.id
This link is pretty good at explaining the difference between JOINs。
还应注意,即使 (+)
有效,Oracle recommends not using it:
Oracle 建议您使用 FROM 子句 OUTER JOIN 语法而不是 Oracle 连接运算符。使用 Oracle 连接运算符 (+) 的外部连接查询受以下规则和限制的约束,这些规则和限制不适用于 FROM 子句的 OUTER JOIN 语法:
在 Oracle 中,(+) 表示 JOIN 中的“可选”表。所以在你的查询中,
SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id(+)
这是表 'b' 到表 'a' 的 LEFT OUTER JOIN。当另一方(可选表'b')没有数据时,它将返回表'a'的所有数据而不会丢失其数据。
https://i.stack.imgur.com/bceqP.jpg
同一查询的现代标准语法是
SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b ON a.id=b.id
或使用 a.id=b.id
的简写(并非所有数据库都支持):
SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a
LEFT JOIN b USING(id)
如果您删除(+),那么它将是正常的内部连接查询
Oracle 和其他数据库中的旧语法:
SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id=b.id
更现代的语法:
SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a
INNER JOIN b ON a.id=b.id
或者简单地说:
SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a
JOIN b ON a.id=b.id
https://i.stack.imgur.com/ggzGl.jpg
它只会返回“a”和“b”表“id”值相同的所有数据,表示公共部分。
如果您想让您的查询成为 Right Join
这与 LEFT JOIN 相同,但切换哪个表是可选的。
https://i.stack.imgur.com/vjgSN.jpg
旧的 Oracle 语法:
SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a,b
WHERE a.id(+)=b.id
现代标准语法:
SELECT a.id, b.id, a.col_2, b.col_2, ...
FROM a
RIGHT JOIN b ON a.id=b.id
参考和帮助:
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187
Left Outer Join using + sign in Oracle 11g
https://www.w3schools.com/sql/sql_join_left.asp
(+) 运算符表示外连接。这意味着即使没有匹配项,Oracle 仍会从连接的另一端返回记录。例如,如果 a 和 b 是 emp 和 dept,并且您可以将员工未分配到部门,则以下语句将返回所有员工的详细信息,无论他们是否已分配到部门。
select * from emp, dept where emp.dept_id=dept.dept_id(+)
所以简而言之,删除 (+) 可能会产生显着差异,但您可能暂时不会注意到,具体取决于您的数据!
在实践中,+ 符号直接放在条件语句中和可选表的一侧(允许在条件中包含空值或空值的表)。
不定期副业成功案例分享