我正在检查一些旧的SQL语句,以便记录它们并可能增强它们.
DBMS是Oracle
我不明白这样的陈述:
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
这个链接很好地解释了JOIN之间的区别.
还应该注意的是,即使(+)
工作,Oracle建议不要使用它:
Oracle建议您使用
FROM
子句OUTER JOIN
语法而不是Oracle连接运算符.使用Oracle连接运算符的外连接查询(+)
受以下规则和限制的约束,这些规则和限制不适用于FROM
子句OUTER JOIN
语法:
(+)运算符表示外连接.这意味着即使没有匹配项,Oracle仍会从连接的另一端返回记录.例如,如果a和b是emp和dept,并且您可以将员工取消分配给部门,则以下语句将返回所有员工的详细信息,无论他们是否已分配到部门.
select * from emp, dept where emp.dept_id=dept.dept_id(+)
简而言之,删除(+)可能会产生显着性差异,但根据您的数据,您可能暂时不会注意到!
在Oracle中,(+)表示JOIN中的"可选"表.所以在你的查询中,
SELECT a.id, b.id, a.col_2, b.col_2, ... FROM a,b WHERE a.id=b.id(+)
它是一个LEFT OUTER JOIN'b'表,带有'a'表.就像现代左连接查询一样.(它会返回'a'表的所有数据而不会丢失另一侧的数据可选表'b'会丢失他的数据)
SELECT a.id, b.id, a.col_2, b.col_2, ... FROM a LEFT JOIN b ON a.id=b.id
要么
SELECT a.id, b.id, a.col_2, b.col_2, ... FROM a LEFT JOIN b USING(id)现在,如果你删除(+)那么它将是正常的内连接查询,
SELECT a.id, b.id, a.col_2, b.col_2, ... FROM a,b WHERE a.id=b.id
它只返回'a'和'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
要么
SELECT a.id, b.id, a.col_2, b.col_2, ... FROM a,b WHERE a.id(+)=b.id参考和帮助:
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:6585774577187
使用Oracle 11g中的+符号左外连接
https://www.w3schools.com/sql/sql_join_left.asp
实际上,+符号直接放在条件语句中和可选表的一侧(允许在条件中包含空值或空值的表).