在我的数据仓库中,我有以下维度,我想创建一个父子层次结构。我的问题是这个。主键是OfficerPeopleID,它不是父级或子级。父母是MgrPeopleID,孩子是PeopleID 如果我在为PeopleID创建维度时更改默认密钥,则看起来好像它可以工作,但是在处理时我收到错误,因为它看到了PeopleID的多个副本。存在倍数的原因是因为它是SCD类型2而主键(OfficerPeopleID)是表的代理键。我知道我不是唯一一个尝试在主键以外的字段上创建父子引用的人吗? 谢谢!
答案 0 :(得分:1)
我认为你不想这样做。如果我理解正确,PeopleID是您的自然密钥或源系统密钥,OfficerPeopleID是您的DW代理密钥。在这种情况下,您需要有一个存储Parent代理键而不是父自然键的列。换句话说,您应该能够为表创建一个外键。根据你现在的情况,你可以为经理提供多条记录,这使得哪条记录是正确的记录是不明确的。此外,为了让孩子为你工作,孩子必须成为表的关键。
如果要正确执行此操作,则应在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
答案 1 :(得分:0)
如果PeopleID包含重复记录,您可以这样做,要么使其成为唯一,要么使用这两个字段创建关系。
我还建议您在DSV上创建两个单独的条目,一个用于Managers,另一个用于Employees,具有以下查询:
管理器:
select PeopleID as ManagerID, name as Name from OfficerPeopleDim
员工:
select PeopleID as EmployeeID, name, MgrPeopleId as Manager
from OfficerPeopleDim
where MgrPeopleId is not null
所以它看起来像这样(左)并在右边产生结果: