Oracle:在WHERE子句中,“(+)”是做什么的?

在我们正在迁移的Oracle应用程序中发现以下内容(概括)

SELECT Table1.Category1, Table1.Category2, count(*) as Total, count(Tab2.Stat) AS Stat FROM Table1, Table2 WHERE (Table1.PrimaryKey = Table2.ForeignKey(+)) GROUP BY Table1.Category1, Table1.Category2 

(+)在WHERE子句中做什么? 我以前从来没有见过这样用过。

根据“=”这个“(+)”的哪一边,它表示一个LEFT OUTER或者一个RIGHT OUTER join(在这种情况下,这是一个左外连接)。这是旧的Oracle语法,首先学习它,因为他们喜欢它使他们的代码更短。

为了可读性,最好不要使用它。

正如其他人所说的, (+)语法已经过时了,Oracle用了多年的专有语法来完成与OUTER JOIN相同的结果。 我假定他们在SQL-92决定标准语法之前采用了他们的专有语法。

使用标准的SQL OUTER JOIN语法(现在被所有主要的RDBMS实现支持)的等效查询将显示如下:

 SELECT Table1.Category1, Table1.Category2, COUNT(*) AS Total, COUNT(Table2.Stat) AS Stat FROM Table1 LEFT OUTER JOIN Table2 ON (Table1.PrimaryKey = Table2.ForeignKey) GROUP BY Table1.Category1, Table1.Category2; 

意思是:

  • 查询结果中包含Table1中的所有行。
  • 如果表2中有匹配的行,则包含这些行(如果Table1 Table2有多个匹配行,则重复来自Table1内容)。
  • Table2中没有匹配的行的情况下,查询结果中的所有Table2列都使用NULL

这是一个非ANSI左外连接表示法。 从Oracle9i开始,使用“(+)”表示法的混淆外部连接语法已被ISO 99外部连接语法取代。