sql - 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
解决方案
试试这个,看看它是否能提高性能:
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
推荐阅读
- c# - C#:SerialPort.Open 挂起
- html - div 中的两个按钮未对齐
- c# - Unity 包管理器错误:zlib:数据检查不正确。未加载任何包
- html - CSS:如何删除图像和边框之间的空间?
- php - 尝试显示数据库中的图像时出现问题
- amazon-web-services - Agora 云录制不保存到 S3 并返回 404
- gcc - 疯狂寻找错误的路径
- python - Pandas pivot_table:过滤聚合函数
- javascript - 我无法使用 aws education aacount 访问 appsync 服务
- java - 为什么弹簧安全上下文不保留经过身份验证的自定义用户?