ChatGPT解决这个技术问题 Extra ChatGPT

Oracle "(+)" 运算符

我正在检查一些旧的 SQL 语句,以便记录它们并可能增强它们。

DBMS 是甲骨文

我不明白这样的声明:

select ...
from a,b
where a.id=b.id(+)

我对 (+) 运算符感到困惑,并且无法在任何论坛上获得它......(在引号内搜索 + 也不起作用)。

无论如何,我使用了 SQLDeveloper 的“解释计划”,我得到一个输出说 HASH JOIN, RIGHT OUTER 等。

如果我在查询末尾删除 (+) 运算符,会有什么不同吗?在使用 (+) 之前,数据库是否必须满足某些条件(例如具有某些索引等)?如果您能给我提供一个简单的理解,或者提供一些我可以阅读相关内容的好链接,那将非常有帮助。

谢谢!

它不是运营商。它只是影响 JOIN 功能的一段语法。
@malckier 称它为运营商并不意味着它是运营商。如果文档更好,也许人们会理解它的意思。

M
Mr. Llama

这是 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 语法:


非常正确。为了使 (+) 在我的脑海中保持笔直(左侧与右侧),我喜欢将 (+) 视为“如果未找到匹配项,则添加 NULL 值”。例如,“a.id=b.id(+)”表示如果与 a.id 不匹配,则允许 b.id 为 NULL。
谢谢..我想在 from 子句中添加它应该会产生相同的结果!
您可能希望获得官方 Oracle 文档的链接:docs.oracle.com/html/A95915_01/sqopr.htm
谢谢@beach,也许我也会记住这一点。
我不得不双重接受您指定加入标准的顺序。我通常将其视为 SELECT * FROM a LEFT JOIN b ON a.id = b.id ... not b.id = a.id .... 这并不重要。
M
Md. Salman Fahad Famous

在 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


圆圈标签“table1”和“table2”是无稽之谈。圆形元素最简单的含义是输出行。然后左新月包含 table1 的空扩展行,右新月包含 table2 的空扩展行。圆圈的其他含义是模糊的。你认为这些图表到底是什么意思?除了盲目地抄袭别人的(糟糕的)演示文稿之外,你为什么要把它们放进去?
您现在已将圆圈标记为 a 和 b。圆圈不是 a & b 的行。左右圆圈可以合理地标记为左连接 b 和右连接 b 的行。此外,您没有根据输入描述那些被包围的行。自己找出圈子里的东西。如果您要在圆圈上贴标签 a 和 b,请用文字清楚地说明每个标签与其圆圈的关系。 (没有直接的理由将它们标记为 a 和 b。)您正确标记了绿色区域是件好事。
f
fthiella

(+) 运算符表示外连接。这意味着即使没有匹配项,Oracle 仍会从连接的另一端返回记录。例如,如果 a 和 b 是 emp 和 dept,并且您可以将员工未分配到部门,则以下语句将返回所有员工的详细信息,无论他们是否已分配到部门。

select * from emp, dept where emp.dept_id=dept.dept_id(+)

所以简而言之,删除 (+) 可能会产生显着差异,但您可能暂时不会注意到,具体取决于您的数据!


s
sunny

在实践中,+ 符号直接放在条件语句中和可选表的一侧(允许在条件中包含空值或空值的表)。


(+) 紧挨着列名的右侧。这个答案并不清楚。 “在实践中”应该是什么意思? (修辞。)(而且您可能不是指“陈述”。)