Oracle LEFT OUTER JOIN 最佳实践

Best practices of Oracle LEFT OUTER JOIN

我是 sql 的新手,我使用 Sql Developer (Oracle db)。 当我需要 select 一些具有空值的数据时,我写了其中一个 selects:

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. 我应该进一步使用哪个(什么是最佳实践),也许有更好的方法来 select 相同的数据?

表格示例:

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

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

当您需要属性 table.

的第二列时,使用外连接的查询更容易扩展

第一个查询使 crystal 清楚地表明您希望每个项目的 table 属性中有零个或一个匹配项。如果数据不一致,或者您的查询有错误,例如忘记条件,它将失败,这很好。

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

所以这是个人喜好的问题,也是您选择查询如何处理不一致的问题。选择哪个查询。

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

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

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