• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
PowerCoder
博客园    首页    新随笔    联系   管理    订阅  订阅

SSAS的维度表之间的关系只能有一个不能有多个

我们在SSAS中创建维度的时候,有时候可能一个维度需要用到多个表的字段作为维度属性,那么这多个表之间势必存在关联关系,但是切记维度表之间的关联关系有且只能有一个不能有多个,下面我们来看一个例子。

 

现在我们创建了一个维度Customer,由于该维度中的属性除了用到Customer表的字段以外,还要用到了Geography表的字段,所以Customer用到了两个表。

 

但是Customer表和Geography表之间现在存在两个依赖关系

其中一个关系是Customer.CustomerKey到Geography.CustomerKey

 

另一个关系是Customer.GeographyKey到Geography.GeographyKey

 

在理想状态下我们认为在处理Customer维度的时候,这两个关系会作为Customer表和Geography表连接的条件同时生效,也就是说会有Customer.GeographyKey=Geography.GeographyKey and Customer.CustomerKey=Geography.CustomerKey这样一个关系存在。

 

但是实际情况是如何呢?

我们现在看一看Customer维度的属性Geography Info,它的KeyColumns是Customer表的GeographyKey字段,NameColumns是Geography表的City字段,所以这个维度属性实际上就同时用到了Customer表和Geography表

 

接下来我们处理Customer维度,看看生成Geography Info属性时的Sql语句是怎样的

生成Geography Info属性时的Sql语句如下

SELECT 
  DISTINCT
 [dbo_DimCustomer].[GeographyKey] AS [dbo_DimCustomerGeographyKey0_0],[dbo_DimGeography].[City] AS [dbo_DimGeographyCity1_0]
  FROM [dbo].[DimCustomer] AS [dbo_DimCustomer],[dbo].[DimGeography] AS [dbo_DimGeography]
  WHERE 
  (
   
  (
   [dbo_DimCustomer].[GeographyKey]   =  [dbo_DimGeography].[GeographyKey]
  )
 
  )

我们惊讶地发现虽然我们前面在Customer表和Geography表之间定义了两个连接关系,但是只有其中的Customer.GeographyKey=Geography.GeographyKey生效了,而Customer.CustomerKey=Geography.CustomerKey这个关系在上面的Sql语句中根本没有出现。。。

 

这说明虽然我们在Customer表和Geography表之间定义了两个连接关系,但是在处理Customer维度的时候只有一个关系是起作用的,另一个关系被SSAS忽略了。所以维度表之间的关系不能有多个,有且只能有一个。

现在我们将上面Customer.GeographyKey=Geography.GeographyKey和Customer.CustomerKey=Geography.CustomerKey从两个关系合并为一个关系如下

 

然后再次处理Customer维度,查看Geography Info属性的Sql语句如下

SELECT 
  DISTINCT
 [dbo_DimCustomer].[GeographyKey] AS [dbo_DimCustomerGeographyKey0_0],[dbo_DimGeography].[dbo_DimGeographyCity1_0] AS [dbo_DimGeographyCity1_0]
  FROM [dbo].[DimCustomer] AS [dbo_DimCustomer],
      (
     

    SELECT [City] AS [dbo_DimGeographyCity1_0],GeographyKey   AS [dbo_DimGeographyCustomerKey1_1],[GeographyKey] AS [dbo_DimGeographyGeographyKey1_2]
  FROM [dbo].[DimGeography]
     )
     AS [dbo_DimGeography]
  WHERE 
  (
   
  (
   [dbo_DimCustomer].[CustomerKey]   =  [dbo_DimGeography].[dbo_DimGeographyCustomerKey1_1]
  )
     AND  
  (
   [dbo_DimCustomer].[GeographyKey]   =  [dbo_DimGeography].[dbo_DimGeographyGeographyKey1_2]
  )
 
  )

很明显这一次Customer.GeographyKey=Geography.GeographyKey和Customer.CustomerKey=Geography.CustomerKey这两个连接关系都生效了,达到了我们预期的效果。

所以切记SSAS中一个维度中的多个表之间的连接关系有且只能有一个,如果定义了多个连接关系实际上也只有一个会起作用。

 

posted @ 2016-08-11 12:06  PowerCoder  阅读(1687)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3