如何在 obiee 的左外连接的一部分中包含分析过滤器(左连接变为内连接)

Posted

技术标签:

【中文标题】如何在 obiee 的左外连接的一部分中包含分析过滤器(左连接变为内连接)【英文标题】:How to include filters of analysis in on part of the left outer join in obiee (left join becoming inner join) 【发布时间】:2021-07-29 11:29:53 【问题描述】:

最近我们遇到了外连接作为内连接工作的问题。我们所做的步骤如下: 1.在BMM层中创建了暗表和事实表的左外连接。 2.在 OBIEE 中创建分析以检查此连接 3.生成的Sql显示左外连接语句,但OBIEE分析中使用的过滤器放在where子句中,左外连接被忽略。

这里是生成的 SQL 代码:

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 */Q
   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

如您所见,dim D4703 和事实 F02 之间的连接是在 coa_code 列上创建的。维度 D4703 在列 coa_code 上具有空值的行。我们遵循的逻辑是左外连接应该返回dim D4703 中的所有行(包括空值),并且只返回事实表中匹配的那些行。 但是,那里的 sql 查询只返回匹配的行。当您将 day 过滤器放在 on 语句中的 where 子句中时,它会返回空值。

所以我想问一下如何使左外连接按预期工作?管理工具或其他任何地方是否有任何选项?

【问题讨论】:

我没有看到名为 D4703 的别名。再次检查您的查询。 @MouradGHERSA, D4704 显示在 cmets /* D4703 Dm Cbm T17 */ 中,它是 rpd 中的别名,在物理查询上面 D4703 的别名是 T75347。很抱歉造成混乱 【参考方案1】:

我们称之为“保留维度”。使用 OBIEE 有两种方法可以实现这一点:

1- 使用完整的外连接,按照这篇文章:

https://datacadamia.com/dat/obiee/obis/full_outer_join

2- 第二种是通过添加 Fact 表在维度之间使用交叉连接,请遵循这篇文章:

https://datacadamia.com/dat/obiee/obis/densification_repository?s[]=preservation&s[]=dimensions

我最喜欢的是第二种方法,这是我的建议。

【讨论】:

谢谢,Mourad,我会试试这两种方法,让你知道

以上是关于如何在 obiee 的左外连接的一部分中包含分析过滤器(左连接变为内连接)的主要内容,如果未能解决你的问题,请参考以下文章

真正的左外连接

如何在 Yii2 中创建复杂的左外连接?

linq中的左外连接

LINQ查询中的左外连接[重复]

如何在雪花的左外连接期间提取所有值(即使是那些不匹配的值)?

如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接