2013-03-05 118 views
1

只是我已经跨越SQL查询中像下面的存储过程的一个传来:(+)符号

SELECT 
    * 
FROM 
    account a, 
    performance p, 
    customer c, 
    override o 
WHERE 
    a.account_id = p.account_id (+) 
    AND a.account_id = c.account_id (+) 
    AND o.override_type(+) = 'O' 

能否请您解释一下什么是(+)符号的打法吗?和使用左侧和右侧的区别。

在此先感谢。

+0

可能出现[Oracle SQL中的(+)做什么?](http://stackoverflow.com/questions/1376442/what-does-do- in-oracle-sql) – Ben 2013-03-05 08:31:58

+0

虽然这是一个更好的解释:http://stackoverflow.com/questions/1193654/difference-between-oracles-plus-notation-and-ansi-join-notation – Ben 2013-03-05 08:32:13

回答

4

这是Oracle中OUTER JOIN的旧语法(我不知道是否有其他使用相同旧语法的RDBMS)。

小康:使用使用LEFT OUTER JOINRIGHT OUTER JOIN,而不是+符号明确ANSI-92 OUTER JOIN语法。

+0

这个存储过程有点7或8岁。感谢您澄清我的疑问。 – SuRa 2013-03-05 07:10:51

+0

@Sundar - 随时欢迎您:)这是什么RDBMS?它是Oracle吗? – 2013-03-05 07:11:50

+0

这是Oracle。 – SuRa 2013-03-05 07:16:20

1

(+)是oracle(8和之前版本)中的传统外连接语法。 这是非常严格的,并处理许多案件只是错误的。不要再使用它了。 Oracle支持从版本9开始的ansi连接(例如,left outer join)。

+0

你将不得不拿出“处理很多案例错误”的证据。它有各种限制,但没有比ANSI语法多得多,有时仍被使用,因为Oracle的ANSI语法实现有时会导致不正确的查询计划,而+语法不会(尽管我不喜欢使用它)。 – Ben 2013-03-05 08:35:25

+0

您不能对已经外连接的表进行外连接(例如,订购外连接客户外连接地址)。外连接后你甚至无法加入。在外连接表上有附加条件时会出现问题。它没有真正的记录。问题在于,当您编写无效查询时,它不会投诉。它只是返回明显的错误数据。几年前,我记得我得到的值是在整个数据库中没有出现在该列上的查询返回的值。就像我喜欢Oracle数据库一样,这个外部连接失败了。 – 2013-03-05 13:44:08