如何在OBIEE左外连接on子句加入分析过滤器 避免左连变内连
OBIEE左外连接退化为内连接问题解决方案
问题根因
OBIEE默认将分析中添加的过滤器下推到全局WHERE子句执行,当过滤对象是左外连接的右表(含关联的维度表)字段时,左连接生成的右表为NULL的行无法满足过滤条件,会被直接剔除,最终左连接效果等价于内连接。
你提供的生成SQL中,WHERE子句存在对事实表字段T4110.OPER_DAY的过滤逻辑,就是失效的直接原因:
WITH SAWITH0 AS (select sum(T4110.SALDO_OUT_EQV) as c1, T5520.CAL_DAY as c2, T75347.LINE_CODE as c3, T75347.LINE_NAME as c4, T3160.CODE as c5 from DM_CBM_T17_V T75347 /* D4703 Dm Cbm T17 */ left outer join(DM_CALENDAR_V T5520 /* D03 Calendar */ inner join(DM_FILIALS_V T3160 /* D04 Filials */ inner join DM_COA_SALDO_V T4110 /* F02 Saldo Coa */ On T3160.CODE = T4110.FILIAL_CODE) On T4110.OPER_DAY = T5520.CAL_DAY) On T4110.COA_CODE = T75347.COA_CODE where (T4110.OPER_DAY = TO_DATE('2021-05-06', 'YYYY-MM-DD') and T5520.CAL_DAY = TO_DATE('2021-05-06', 'YYYY-MM-DD')) group by T3160.CODE, T5520.CAL_DAY, T75347.LINE_CODE, T75347.LINE_NAME) select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4, D1.c5 as c5, D1.c6 as c6 from (select 0 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4, D1.c5 as c5, D1.c1 as c6 from SAWITH0 D1 order by c2, c5, c3, c4) D1 where rownum <= 10000000
可通过OBIEE Admin工具实现的配置方案
- BMM层逻辑连接属性调整
打开Admin工具进入BMM层,找到维度表D4703和事实表F02的逻辑连接,勾选将右表关联过滤器应用于ON子句而非WHERE子句(部分版本表述为「Apply filters on join condition to right table instead of WHERE clause」)。配置后OBIEE生成SQL时会自动将右表相关的过滤条件移到JOIN的ON子句中,不会破坏左连接逻辑。 - 事实表逻辑表源预配置过滤
如果日期是该事实表的通用过滤维度,可以直接在事实表的逻辑表源(Logical Table Source)中预先配置日期过滤规则,而非在前端分析中添加过滤器。该方式配置的过滤条件会作用于表读取阶段,不会放到全局WHERE子句影响左连接。 - 物理层连接属性调整
进入物理层找到对应表的连接配置,关闭「后连接过滤」属性,强制该连接关联的所有表过滤条件在连接阶段执行。注意该配置全局生效于该连接,需提前评估对其他使用该连接的分析的影响。
前端临时解决方法
如果不需要修改后台元数据,可在创建分析时调整过滤器逻辑:
- 选择基于SQL的逻辑列过滤,手动将过滤逻辑写在关联子查询中,避免触发全局WHERE子句下推
- 针对日期维度的过滤,可在过滤规则中添加兼容空值的逻辑,比如
T4110.OPER_DAY = TO_DATE('2021-05-06', 'YYYY-MM-DD') OR T4110.OPER_DAY IS NULL,仅在需要保留左连接空值行的分析中使用。
配置完成后重新生成分析SQL,确认过滤条件已从WHERE子句移动到左连接的ON子句,再验证数据是否包含维度表coa_code为空的行即可。
内容的提问来源于stack exchange,提问作者Sherzodbek
相关产品推荐
相关产品推荐

