【问题标题】:Best practices of Oracle LEFT OUTER JOINOracle LEFT OUTER JOIN 最佳实践
【发布时间】:2015-11-13 12:33:42
【问题描述】:

我是 sql 新手,我使用 Sql Developer (Oracle db)。 当我需要选择一些具有空值的数据时,我会编写以下选择之一:

1)

SELECT i.number
      ,i.amount
      ,(SELECT value FROM ATTRIBUTES a
        WHERE a.parameter = 'aaa' AND a.item_nr = i.number) AS atr_value
FROM ITEMS i

2)

SELECT i.number
      ,i.amount
      ,a.value as atr_value
FROM ITEMS i
left outer join ATTRIBUTES a
    on a.parameter = 'aaa'
   and a.item_nr = i.number

问题:

  1. 有什么区别?
  2. 如何调用第一种方法(我如何用谷歌搜索它)?我在哪里可以了解它?
  3. 我应该进一步使用哪一个(最佳做法是什么),也许有更好的方法来选择相同的数据?

表格示例:

【问题讨论】:

  • 第二个查询可以返回一个项目的多个属性值,第一个查询会在这种情况下引发错误。
  • 相关子查询与外连接 - 检查解释计划的差异

标签: sql oracle outer-join


【解决方案1】:

您的两个查询并不完全相同。如果第二个表中有多个匹配项,则第一个会生成错误,第二个会生成多行。

哪个更好?作为一般规则,LEFT JOIN 方法(第二种方法)被认为比相关子查询(第一种方法)更好。 Oracle 有一个非常好的优化器,它提供了许多优化连接的方法。我还认为 Oracle 可以为相关子查询使用JOIN 算法(并非所有数据库都如此智能)。而且,使用正确的索引,这两种形式可能具有非常相似的性能。

在某些情况下,相关子查询的性能优于等效的 JOIN 构造。不过,对于这个例子,我希望性能是相似的。

【讨论】:

    【解决方案2】:

    如果表属性中的匹配行不超过一个,查询会执行相同的操作。这只是查询相同数据的两种方法。这两个查询都很好而且很直接。

    如果有多个匹配项,则查询一个(使用相关子查询)将失败。那么这对于给定的任务是不合适的。

    当您需要属性表中的第二列时,使用外连接的查询更容易扩展。

    第一个查询清楚地表明,您期望每个项目的表属性中有零个或一个匹配项。如果出现数据不一致或查询中出现错误(例如忘记条件),它会失败,这很好。

    如果出现此类错误,第二个查询将简单地检索更多行,这可能是不希望的。

    所以这取决于个人喜好和您的选择,查询如何处理选择哪个查询的不一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-10
      • 2013-03-10
      • 2010-09-29
      • 2018-12-04
      • 2015-04-02
      • 1970-01-01
      • 2015-05-19
      相关资源
      最近更新 更多