2012-04-25 27 views
1

在我的數據倉庫中,我有以下維度來創建父子層次結構。我的問題是這樣的。主鍵是OfficerPeopleID,它不是父或子。父母是MgrPeopleID,孩子是PeopleID。
如果我在創建維度到PeopleID時更改默認鍵,它看起來好像會起作用,但是由於它看到多個PeopleID副本,因此在處理時遇到錯誤。存在倍數的原因是因爲它是SCD類型2和主鍵,(OfficerPeopleID)是表的替代鍵。我知道我不是唯一一個試圖在主鍵以外的字段上創建父子引用的人嗎? 謝謝!在SSAS中創建父子引用的問題

Dimension

回答

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 
+0

謝謝!我相信對我來說最好的方案就是按照你所說的去做,並且有一個存儲Parent代理鍵的列。如果您對我如何能夠做到這一點有任何建議,我一定會很感激! – John 2012-04-28 02:22:06

+0

我知道我可以進去並通過DSV添加列,我只是不知道如何填充它將與父母代理鍵 – John 2012-04-28 02:25:30

+0

嘿約翰看到上面的變化 – 2012-04-30 18:36:56

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 

所以它會看起來像這樣(左邊)並在右邊產生結果: enter image description here

+0

我不認爲他可以做到上述。他需要代理鍵(OfficerPeopleID)加入維度。您的圖缺少代理鍵。另外,在你的第二個查詢中,你會錯過管理者本身,這也是員工。他可以簡單地通過爲管理人員添加代理鍵來解決問題,並且這將是真正的外鍵,如下所述。 – 2012-04-27 20:13:39