在我们正在迁移(通用化)的基于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
包含在查询结果中.
在有匹配行的位置Table2
,包括那些行(Table1
如果有多个匹配行,则重复内容Table2
).
如果没有匹配的行Table2
,则使用查询结果中的NULL
所有Table2
列.
它是非ANSI左外连接表示法.从Oracle9i开始,使用'(+)'表示法的混淆外连接语法已被ISO 99外连接语法取代.