MicroStrategy ONE
Preserve All Lookup Table Elements(保留所有查找表元素)
“Preserve All Lookup Table Elements”(保留所有查找表元素)VLDB 属性用于显示存在于查找表中的所有实体元素,即使结果集中没有相应的事实也是如此。例如,您的报表包含“商店”和 Sum(Sales) 数据,且有可能某个商店并无任何销售记录。即使这些商店没有销售记录,您还是需要在最终报表中显示所有商店名称。要实现此操作,您不能依赖于销售额事实表中的商店。相反,您必须确保查找表中的所有商店必须加入到最终报表中。SQL 引擎需从查找表到事实表间执行左外部联接。
而模板上可能存在多个实体。要保留所有实体元素,分析引擎需要在对事实表执行左外部联接之前在相关的实体查找表之间执行笛卡尔联接。
保留查找表和最终路径结果表中的公共元素(默认)。
分析引擎会对查找表进行普通的联接操作(同等联接)。
保留根据事实表键联接到最终路径结果表的查找表元素。
有时事实表级别并不是与报表或模板的级别相同。例如,某报表包含 Store(商店)、Month(月份)和 Sum(Sales)(销售额)度量,但是事实表所处的级别是 Store(商店)、Day(日)和 Item(产品)。保留所有商店和月份的元素有两种方法:
- 先执行一个左外部联接以保留 Store、Day 和 Item 级别的所有实体元素,然后再在 Store 和 Month 级别进行聚合。
- 首先进行聚合,然后执行左外部联接以获取所有实体元素。
此选项只适用于第一种方法。在之前所给的示例中,产生了两个 SQL 语句:
语句1:LOOKUP_STORE 与 LOOKUP_DAY 以及 LOOKUP_ITEM 进行交叉联接èTT1
语句2:TT1 在 Store、Day、Item 与 Fact_Table 发生左外部联接
这种方法的优势在于您可以在同一个路径(路径 2)执行左外部联接和聚合。缺点在于与查找表发生的笛卡尔联接在更低的级别(路径 1)执行,因此笛卡尔联接表(TT1)的结果可能非常大。
保留基于无筛选器模板实体与最终路径结果表联接的查找表元素。
此选项与上述第二种方法相对应。使用同一个示例并产生 3 个 SQL 路径:
- 路径 1:Fact_Table 在 Store 和 Month 级别聚合到 TT1。这实际上是未启用此设置的普通报表上的最终语句。
- 语句2:LOOKUP_STORE 交叉连接 LOOKUP_MONTH > TT2
- 语句3:TT2 在“Store、Month”级别与 TT1 发生左外部联接
此方法需要比前一选项多一个路径,但是交叉联接表(TT2)通常更小。
保留基于含筛选器模板实体与最终路径结果表联接的查找表元素。
此选项与选项 3 类似。唯一的不同是报表筛选器被应用到了最终语句(路径 3)。例如,某报表包含 Store、Month 和 Sum(Sales),并应用了筛选器 Year = 2002。您希望无论是否产生销售额都显示 2002 年每月的各家商店。但是,您不应显示其他年份的任何月份(只显示 2002 年的 12 个月份)。选项 4 可解决此问题。
这 保留查找表和最终结果表的共同元素 选项只是在事实表和查找表之间生成直接连接。产生的结果和 SQL 如下。
商店 | 美元销售额 |
东部 |
5000 |
中部 |
8000 |
南部 |
12000 |
select a11.Store_id Store_id,
max(a12.Store) Store,
sum(a11.DollarSls) WJXBFS1
from Fact a11
join Store a12
开启(a11.Store_id = a12.Store_id)
group by a11.Store_id
“保留根据事实表键联接到最终路径结果表的查找表元素”选项创建的临时表是所有查找表键列之间的笛卡尔联接。然后,该事实表再与临时表发生外部联接。这将保留所有查找表元素。产生的结果和 SQL 如下。
商店 | 美元销售额 |
东部 |
5000 |
中部 |
8000 |
南部 |
12000 |
北部 |
|
select distinct a11.Year Year
into #ZZOL00
from Fact a11
select pa1.Year Year,
a11.Store_id Store_id
into #ZZOL01
from #ZZOL00 pa1
cross join Store a11
选择 pa2.Store_id Store_id,
max(a12.Store) Store,
sum(a11.DollarSls) WJXBFS1
from #ZZOL01 pa2
left outer join Fact a11
on (pa2.Store_id = a11.Store_id and
pa2.Year = a11.Year)
join Store a12
on (pa2.Store_id = a12.Store_id)
按 pa2.Store_id 分组
drop table #ZZOL00
drop table #ZZOL01
若选择“保留基于无筛选器模板与最终路径结果表联接的查找表元素”选项,将通过左外部联接到最终 SQL 语句并且只联接模板上的实体的方式来保留查找表元素。在此示例以及下一个示例中,将加入“不等同于中央的商店”筛选器。产生的结果和 SQL 如下。
商店 | 美元销售额 |
东部 |
5000 |
中部 |
|
南部 |
12000 |
北部 |
|
select a11.Store_id Store_id,
sum(a11.DollarSls) WJXBFS1
into #ZZT5X00003UOL000
from Fact a11
where a11.Store_id not in (2)
group by a11.Store_id
select a11.Store_id Store_id,
a11.Store Store,
pa1.WJXBFS1 WJXBFS1
from Store a11
left outer join #ZZT5X00003UOL000 pa1
开启(a11.Store_id = pa1.Store_id)
drop table #ZZT5X00003UOL000
“保留基于含筛选器模板实体与最终路径结果表联接的查找表元素”是最新选项,它与上述选项并无差异,不过,您可在最终路径中采用筛选器。产生的结果和 SQL 如下。
商店 | 美元销售额 |
东部 |
5000 |
南部 |
12000 |
北部 |
|
select a11.Store_id Store_id,
sum(a11.DollarSls) WJXBFS1
into #ZZT5X00003XOL000
from Fact a11
where a11.Store_id not in (2)
group by a11.Store_id
select a11.Store_id Store_id,
a11.Store Store,
pa1.WJXBFS1 WJXBFS1
from Store a11
left outer join #ZZT5X00003XOL000 pa1
开启(a11.Store_id = pa1.Store_id)
where a11.Store_id not in (2)
drop table #ZZT5X00003XOL000