在我的数据仓库中,我有以下要创建父子层次结构的维度。我的问题是这个。主键是OfficerPeopleID,它既不是父项也不是子项。父级是 MgrPeopleID,子级是 PeopleID。
如果在将维度创建为 PeopleID 时更改默认键,它看起来好像可以工作,但随后我在处理时收到错误,因为它看到了 PeopleID 的多个副本。有多个的原因是因为它是 SCD 类型 2,主键 (OfficerPeopleID) 是表的代理键。我知道我不是唯一一个尝试在主键以外的字段上创建父子引用的人?谢谢!
问问题
1421 次
2 回答
1
我不认为你会想要那样做。如果我理解正确,PeopleID 是您的自然密钥或源系统密钥,OfficerPeopleID 是您的 DW 代理密钥。在这种情况下,您需要有一列存储父代理键而不是父自然键。换句话说,您应该能够为表自己创建一个外键。根据您现在所拥有的,您可能拥有多个经理的记录,这会使您无法确定哪条记录是正确的。此外,为了让父子为您工作,子必须是表的键。
如果您想正确执行此操作,则应在 ETL 过程中填充 MgrOfficerPoepleID(新列)。如果您打算这样做,请确保在因为 SCD2 而有新行时更新管理器键值。但是,如果您仍希望将其作为 SSAS DSV 中的命名查询,您可以执行以下操作
SELECT
OffcerPeopleID,
-- ... insert other columns here
PeopleID,
MgrPeopleID,
(SELECT OfficerPeopleID
FROM dbo.Employee
WHERE(e.MgrPeopleID = PeopleID) AND (IsCurrent = 1)) AS MgrOfficerPoepleID
FROM dbo.OfficerPeopleDim AS e
WHERE IsCurrent = 1 -- this is your SCD2 flag. you could also use two date range columns
于 2012-04-25T23:57:30.157 回答
0
如果 PeopleID 包含重复记录,则不能这样做,要么使其唯一,要么使用这两个字段创建关系。
我还建议您在 DSV 上创建两个单独的条目,一个用于经理,另一个用于员工,查询如下:
经理:
select PeopleID as ManagerID, name as Name from OfficerPeopleDim
员工:
select PeopleID as EmployeeID, name, MgrPeopleId as Manager
from OfficerPeopleDim
where MgrPeopleId is not null
所以它看起来像这样(左)并在右边产生结果:
于 2012-04-27T08:37:15.073 回答