在 Oracle SQL 中,除了外连接之外,where 子句中的 (+) 运算符的目的是啥?

Posted

技术标签:

【中文标题】在 Oracle SQL 中,除了外连接之外,where 子句中的 (+) 运算符的目的是啥?【英文标题】:What is the purpose of (+) operator in a where clause, other than outer joins, in Oracle SQL?在 Oracle SQL 中,除了外连接之外,where 子句中的 (+) 运算符的目的是什么? 【发布时间】:2020-11-12 15:45:43 【问题描述】:

我有一些非常旧的 Oracle SQL 代码需要查看,如下所示,并试图了解 (+) 运算符在第一次使用后在 where 子句中的作用

select *
     from table_a a,
          table b b
    where 
         a.id = b.id (+)
         and b.seq_nb (+) = 1
         and b.type_cd (+) = 'DOLLR'

我认为(+) 是外连接等价物,所以

 from table_a a,
              table b b
        where 
             a.id = b.id (+)

将与

相同
from table a a left outer join table b b on a.id=b.id

那么你怎么能有如下硬编码变量的外部连接呢?

     b.seq_nb (+) = 1
     and b.type_cd (+) = 'DOLLR'

任何帮助将不胜感激,谢谢!

【问题讨论】:

请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:***.com & 标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 这能回答你的问题吗? Difference between Oracle's plus (+) notation and ansi JOIN notation? LEFT JOIN ON 返回 INNER JOIN ON 行 UNION ALL 不匹配的左表行,由 NULL 扩展。作为 OUTER JOIN ON 的一部分,始终知道您想要什么 INNER JOIN ON。 ON 接受任何条件,而不仅仅是两列相等。 (+) 可以表示 ON 的某些情况。始终阅读手册和您正在使用的功能的介绍,更不用说您遇到问题的功能了。 【参考方案1】:

同理:

select *
from table_a a
   left outer join table_b b 
     on a.id = b.id 
    and b.type_cd = 'DOLLR'
    and b.seq_nb = 1

有时也称为“过滤外连接”。

相当于派生表的外连接:

select *
from table_a a
   left outer join (
     select * 
     from table_b
     where b.type_cd = 'DOLLR'
       and b.seq_nb = 1
   ) b on a.id = b.id 

【讨论】:

以上是关于在 Oracle SQL 中,除了外连接之外,where 子句中的 (+) 运算符的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

oracle的SQL语句中的(+) 左外连接

根据条件更改连接条件 - Oracle

mysql中如何查出除了某个字段外的所有字段的值??

将 Oracle 外连接转换为 SQL Server

Oracle SQL - 基于 concat 的外连接

Oracle SQL 查询(左外连接)