当前位置:  开发笔记 > 编程语言 > 正文

Oracle:WHERE子句中`(+)`做什么?

如何解决《Oracle:WHERE子句中`(+)`做什么?》经验,为你挑选了3个好方法。

在我们正在迁移(通用化)的基于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子句中做什么?我以前从未见过这样的用法.



1> SquareCog..:

根据"="的哪一侧"(+)打开,它表示LEFT OUTER或RIGHT OUTER join(在这种情况下,它是一个左外连接).它是旧的Oracle语法,有时候是人们首选的首先学习它,因为他们喜欢它使他们的代码更短.

为了便于阅读,最好不要使用它.


建议+1 - 没有人应该使用(+)
@Mark - 在过去的8年里,我一直用Perl编程作为我的母语.如果你还没有学会短路和模糊之间的区别,请不要触摸我的代码!
- .5更长的说法更具可读性.比a = a + 1更难阅读.我认为如果你知道这意味着它会更容易.如果您不知道它的含义,请退出我的代码.
感谢关于`(+)`和`=`之间方向的额外消息.

2> Bill Karwin..:

正如其他人所说的那样,(+)语法是过时的专有语法,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列.



3> Otávio Décio..:

它是非ANSI左外连接表示法.从Oracle9i开始,使用'(+)'表示法的混淆外连接语法已被ISO 99外连接语法取代.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有