Oracle LEFT OUTER JOIN的最佳实践

时间:2015-11-13 12:33:42

标签: sql oracle outer-join

我是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. 如何调用第一种方法(我该如何google)?我在哪里可以阅读它?
  3. 我应该进一步使用哪一个(什么是最佳做法),也许有更好的方法来选择相同的数据?
  4. 表格的示例:

    enter image description here

2 个答案:

答案 0 :(得分:0)

如果表属性中永远不会有多个匹配的行,则查询会执行相同的操作。它只是两种查询相同数据的方法。两个查询都很好而且直截了当。

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

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

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

第二个查询只会在出现此类错误时检索更多行,这可能是不可取的。

因此,个人偏好和您选择的问题是如何处理查询选择的不一致问题。

答案 1 :(得分:0)

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

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

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