首页 > 解决方案 > Outer JOIN 2 Tables 使用第三个表来过滤

问题描述

我正在创建一个包含两个非常大的数据集的视图,这些数据集编号数百万行。我使用完全外部连接将两个表连接在一起,并按某些列分组。

我有一个两个表共有的字段 id 列,我需要用户能够过滤视图。最初,我在外连接语法中使用 TableA.F_ID = TableB.F_ID 并且效果非常好。但是,如果 TableB 中有 F_ID 行不在 TableA 中,除非我使用

where TableA.F_ID = <VALUE> or TableB.ID = <VALUE>

为了避免使用 or 子句,我使用了 F_ID 来自查询的寓言,通过内部连接过滤数据。此方法确实有效,但它必须在过滤掉行之前对 TABLEA 和 TABLEB 执行选择,并且查询需要 10 多分钟才能返回。

根据下面的查询,有没有办法对其进行优化以获得更快的最终结果?

select fm.F_ID
       ,fad.A
       ,fad.B
       ,fad.C
       ,fac.A
       ,fac.B
       ,fac.C
       ,fab.SUM as FAB_SUM
       ,fac.SUM as FAC_SUM
from V_FAB_COMBINED_GROUPS fad
FULL OUTER JOIN V_LTB_ALL_GROUPED fac on 
    fab.F_ID = fac.F_ID
    and fac.A = fab.A
    and fac.B = fab.B
    and fac.C = fab.C
inner join fm on (fm.F_ID = fab.F_ID or fm.F_ID = fac.F_ID)
where fm.F_ID = 1 

标签: sqloraclejoinouter-join

解决方案


试试这个,看看它是否能提高性能:

select cte.*
from (select fm.F_ID fm_id
       ,fac.F_ID fac_id   
       ,fad.A
       ,fad.B
       ,fad.C
       ,fac.A
       ,fac.B
       ,fac.C
       ,fab.SUM as FAB_SUM
       ,fac.SUM as FAC_SUM
from V_FAB_COMBINED_GROUPS fab
FULL OUTER JOIN V_LTB_ALL_GROUPED fac  
    on fab.F_ID = fac.F_ID
    and fac.A = fab.A
    and fac.B = fab.B
    and fac.C = fab.C) cte
 join fm on (fm.F_ID = cte.fm_id or fm.F_ID = cte.fac_id)
where fm.F_ID = 1 

推荐阅读