Sql 在Oracle中多次连接同一个表

Sql 在Oracle中多次连接同一个表,sql,database,oracle,plsql,oracle11g,Sql,Database,Oracle,Plsql,Oracle11g,您好,我正在调整一个遗留代码。在一个大查询中,我们有以下两个表 fnd_currencies, and pa_commitment_txns 我在from子句中看到了 fnd_currencies fca, fnd_currencies fcr, fnd_currencies fcp, pa_commitment_txns pct 第一个表已经使用了三次,并且它与相同的列和相同的表进行了外部连接 AND fca.currency_code(+) = pct.acct

您好,我正在调整一个遗留代码。在一个大查询中,我们有以下两个表

  fnd_currencies, and pa_commitment_txns
我在from子句中看到了

  fnd_currencies fca,
  fnd_currencies fcr,
  fnd_currencies fcp,
  pa_commitment_txns pct
 
第一个表已经使用了三次,并且它与相同的
和相同的表进行了外部连接

 AND fca.currency_code(+) = pct.acct_currency_code
  AND fcr.currency_code( +) = pct.receipt_currency_code
  AND fcp.currency_code(+) = pct.project_currency_code

以上三行只能使用
fnd\u货币
表处理一次。有更聪明的方法吗?

通过使用子查询factoring子句,您可以确保只查询一次
fnd\u货币。这看起来是这样的(并通过使用ANSI 92语法保持@gordonlinoff愉快):


这是否真的能给您带来更好的执行时间取决于您的数据细节,您还没有向我们提供这些细节。

您可以使用子查询保理子句确保只查询一次
fnd\u货币。这看起来是这样的(并通过使用ANSI 92语法保持@gordonlinoff愉快):


这是否真的能给您带来更好的执行时间取决于您的数据细节,您没有向我们提供这些细节。

不,至少不容易。但是,您的代码应该使用
左连接
而不是过时的外部连接语法。当然..谢谢Gordon。可能是使用或,但取决于完整查询。@CetinBasoz查询非常复杂。所以我只放了这部分。看看我放的零件有什么解决办法吗?试试或。您有原始查询,删除额外别名可能会有副作用。不,至少不容易。但是,您的代码应该使用
左连接
而不是过时的外部连接语法。当然..谢谢Gordon。可能是使用或,但取决于完整查询。@CetinBasoz查询非常复杂。所以我只放了这部分。看看我放的零件有什么解决办法吗?试试或。你有原始的查询,删除额外的别名可能会有副作用。答案很好。我有一些想法如何重写查询。非常感谢APC。回答得很好。我有一些想法如何重写查询。非常感谢APC。
with ccy as ( select * 
              from fnd_currencies )
select fca.descr as acct_currency
      ,fcr.descr as receipt_currency
      ,fcp.descr as project_currency
      ,pct.*
from pa_commitment_txns pct
left outer join ccy     fca on fca.currency_code = pct.acct_currency_code
left outer join ccy     fcr on fcr.currency_code = pct.receipt_currency_code
left outer join ccy     fcp on fcp.currency_code = pct.project_currency_code