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
问题:
- 有什么区别?
- 如何调用第一种方法(我如何google它)?我在哪里可以阅读它?
- 我应该进一步使用哪个(什么是最佳实践),也许有更好的方法来 select 相同的数据?
表格示例:
如果 table 属性中的匹配行不超过一个,查询也会执行相同的操作。这只是查询相同数据的两种方式。两个查询都很好而且直接。
如果可以有多个匹配项,查询一个(使用相关子查询)将失败。那么它不适合给定的任务。
当您需要属性 table.
的第二列时,使用外连接的查询更容易扩展
第一个查询使 crystal 清楚地表明您希望每个项目的 table 属性中有零个或一个匹配项。如果数据不一致,或者您的查询有错误,例如忘记条件,它将失败,这很好。
如果出现此类错误,第二个查询将简单地检索更多行,这可能是不希望的。
所以这是个人喜好的问题,也是您选择查询如何处理不一致的问题。选择哪个查询。
您的两个查询不完全相同。如果第二个 table 中有多个匹配项,则第一个会生成错误,第二个会生成多行。
哪个更好?作为一般规则,LEFT JOIN
方法(第二种方法)被认为是比相关子查询(第一种方法)更好的做法。 Oracle 有一个非常好的优化器,它提供了许多优化连接的方法。我还认为 Oracle 可以对相关子查询使用 JOIN
算法(并非所有数据库都如此智能)。而且,使用正确的索引,这两种形式的性能可能非常相似。
在某些情况下,相关子查询比等效的 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
问题:
- 有什么区别?
- 如何调用第一种方法(我如何google它)?我在哪里可以阅读它?
- 我应该进一步使用哪个(什么是最佳实践),也许有更好的方法来 select 相同的数据?
表格示例:
如果 table 属性中的匹配行不超过一个,查询也会执行相同的操作。这只是查询相同数据的两种方式。两个查询都很好而且直接。
如果可以有多个匹配项,查询一个(使用相关子查询)将失败。那么它不适合给定的任务。
当您需要属性 table.
的第二列时,使用外连接的查询更容易扩展第一个查询使 crystal 清楚地表明您希望每个项目的 table 属性中有零个或一个匹配项。如果数据不一致,或者您的查询有错误,例如忘记条件,它将失败,这很好。
如果出现此类错误,第二个查询将简单地检索更多行,这可能是不希望的。
所以这是个人喜好的问题,也是您选择查询如何处理不一致的问题。选择哪个查询。
您的两个查询不完全相同。如果第二个 table 中有多个匹配项,则第一个会生成错误,第二个会生成多行。
哪个更好?作为一般规则,LEFT JOIN
方法(第二种方法)被认为是比相关子查询(第一种方法)更好的做法。 Oracle 有一个非常好的优化器,它提供了许多优化连接的方法。我还认为 Oracle 可以对相关子查询使用 JOIN
算法(并非所有数据库都如此智能)。而且,使用正确的索引,这两种形式的性能可能非常相似。
在某些情况下,相关子查询比等效的 JOIN
构造具有更好的性能。不过,对于这个例子,我希望性能是相似的。