我们有一个Oracle 10g,大多数应用程序都在运行OracleForms6i。我发现在视图/包/过程/函数中编写的所有查询都是在WHERE子句级别连接表。示例
SELECT * FROM
TABLE_A A,
TABLE_B B,
TABLE_C C,
TABLE_D D
WHERE
A.ID=B.ID(+)
AND B.NO=C.NO(+)
AND C.STATUS=D.ID
AND C.STATUS NOT LIKE 'PENDING%'此查询仅适用于ORACLE,因为它具有(+)联接限定符,这在其他SQL平台中是不可接受的。上述查询相当于:
SELECT * FROM
TABLE_A A LEFT JOIN TABLE_B B ON A.ID=B.ID
LEFT JOIN TABLE_C C ON B.NO=C.NO
JOIN TABLE_D D ON C.STATUS=D.ID
WHERE
C.STATUS NOT LIKE 'PENDING%'我看到的查询不是在FROM子句中使用join编写的。
我的问题可分为三部分:
问:假设我有相同的Oracle环境,哪个查询在性能、缓存、CPU负载等方面都更好。第一个查询(在哪里连接)或第二个查询(从哪里加入)更好。
问:除了oracle之外,还有其他接受(+)连接限定符的SQL实现吗?如果是,是哪一个?
问:也许让join写在WHERE子句中可以提高查询的可读性,但却削弱了左/右连接的能力,这就是(+)的目的所在。我可以在哪里读到更多关于这个(+)的起源以及为什么它是专门为Oracle发明的?
发布于 2013-11-25 07:53:45
Q1。没什么区别。您可以使用分析和比较执行计划来检查它。
Q2。据我所知,只有先知支持它。但不建议在Oracle RDBMS的最新版本中使用:
Oracle建议您使用FROM子句外部连接语法,而不是Oracle JOIN操作符。使用Oracle join运算符(+)的外部联接查询受以下规则和限制的限制,这些规则和限制不适用于FROM子句外部联接语法:
Q3。在SQL中指定外部联接之前,Oracle“outer”(+)。
发布于 2013-11-25 07:54:51
不应该有性能上的差异。假设您使用的是最近版本的Oracle,Oracle将隐式地将SQL 99语法转换为相应的Oracle特定语法。当然,在所有的软件中都有错误,因此有可能因为某些错误,其中一个或另一个会执行不同的操作。Oracle的最新版本越多,您就越不可能看到不同之处。
创建(+)操作符(以及其他数据库中的其他各种外部连接操作符),是因为在SQL 99标准之前,该标准没有一种表示外部连接的标准方法。在此之前,每个供应商都创建了自己的扩展。甲骨文花了几年时间才支持新的语法。在SQL 99支持的初始版本中,bug更常见(不常见,但比现在更常见)、产品需要继续支持不支持新语法的旧数据库版本,以及人们普遍对旧语法感到满意,现在仍有大量使用旧Oracle语法的代码在编写。
发布于 2013-11-25 07:51:33
A1:
据我所知,它们在语法方面存在差异,而在性能上则有所不同。因此,连接在'where‘子句和连接在’从‘子句之间没有区别。
A2:
为了更好地回答这个问题,所有平台上的标准都是“加入从”子句。所以忘记(+)符号
A3我有时在甲骨文工作过。人们使用(+)符号来表示左/右连接,因为它很容易编写。有些ppl使用join at (FROM)子句,因为它更易读,也更容易理解。
希望这些观点对你有帮助。万一有什么不对,请告诉我。
https://stackoverflow.com/questions/20187129
复制相似问题