首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接从子句和哪里子句之间有什么区别?

连接从子句和哪里子句之间有什么区别?
EN

Stack Overflow用户
提问于 2013-11-25 07:44:55
回答 4查看 4.8K关注 0票数 9

我们有一个Oracle 10g,大多数应用程序都在运行OracleForms6i。我发现在视图/包/过程/函数中编写的所有查询都是在WHERE子句级别连接表。示例

代码语言:javascript
复制
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平台中是不可接受的。上述查询相当于:

代码语言:javascript
复制
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发明的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-25 07:53:45

Q1。没什么区别。您可以使用分析和比较执行计划来检查它。

Q2。据我所知,只有先知支持它。但不建议在Oracle RDBMS的最新版本中使用:

Oracle建议您使用FROM子句外部连接语法,而不是Oracle JOIN操作符。使用Oracle join运算符(+)的外部联接查询受以下规则和限制的限制,这些规则和限制不适用于FROM子句外部联接语法:

Q3。在SQL中指定外部联接之前,Oracle“outer”(+)。

票数 10
EN

Stack Overflow用户

发布于 2013-11-25 07:54:51

不应该有性能上的差异。假设您使用的是最近版本的Oracle,Oracle将隐式地将SQL 99语法转换为相应的Oracle特定语法。当然,在所有的软件中都有错误,因此有可能因为某些错误,其中一个或另一个会执行不同的操作。Oracle的最新版本越多,您就越不可能看到不同之处。

创建(+)操作符(以及其他数据库中的其他各种外部连接操作符),是因为在SQL 99标准之前,该标准没有一种表示外部连接的标准方法。在此之前,每个供应商都创建了自己的扩展。甲骨文花了几年时间才支持新的语法。在SQL 99支持的初始版本中,bug更常见(不常见,但比现在更常见)、产品需要继续支持不支持新语法的旧数据库版本,以及人们普遍对旧语法感到满意,现在仍有大量使用旧Oracle语法的代码在编写。

票数 4
EN

Stack Overflow用户

发布于 2013-11-25 07:51:33

A1:

据我所知,它们在语法方面存在差异,而在性能上则有所不同。因此,连接在'where‘子句和连接在’从‘子句之间没有区别。

A2:

为了更好地回答这个问题,所有平台上的标准都是“加入从”子句。所以忘记(+)符号

A3我有时在甲骨文工作过。人们使用(+)符号来表示左/右连接,因为它很容易编写。有些ppl使用join at (FROM)子句,因为它更易读,也更容易理解。

希望这些观点对你有帮助。万一有什么不对,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20187129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档