2012-09-30 16 views
2

我在我的SQL Server中有一個表格,在這裏我將我的數據倉庫數據從我們的ERP系統中提取出來。SQL數據倉庫,需要幫助使用TSQL SELECT或更好的替代方法填充我的DIMENSION?

從此登臺表(表名:DBO.DWUSD_LIVE),我構建我的維度並加載我的事實數據。

一個例子維度表被稱爲「SHIPTO」,這個尺寸有以下欄目:

"shipto_id 
"shipto" 
"salpha" 
"ssalpha" 
"shipto address" 
"shipto name" 
"shipto city" 

現在我有一個SSIS包,做跨越上述列的SELECT DISTINCT檢索「獨一無二」數據,然後通過SSIS包將「shipto_id」代理鍵分配給。

我目前的TSQL查詢的一個例子是:

SELECT DISTINCT 
"shipto", "salpha", "ssalpha", "shipto address", "shipto name", "shipto city" 
FROM DBO.DWUSD_LIVE 

這個偉大的工程,但不是「迅速」,一些尺寸有10列,並做了不同的選擇那些並不理想。

在此維度中,我的「業務密鑰」列是「SHIPTO」,「SALPHA」和「SSALPHA」

所以,如果我做的:

SELECT DISTINCT 
"shipto", "salpha", "ssalpha" 
FROM DBO.DWUSD_LIVE 

它會產生相同的結果:

SELECT DISTINCT 
"shipto", "salpha", "ssalpha", "shipto address", "shipto name", "shipto city" 
FROM DBO.DWUSD_LIVE 

是否有更好的方法來做到這一點TSQL查詢?我需要所有列,但只需在業務鍵列上使用DISTINCT。

您的幫助表示讚賞。

下面是我的項目是如何在SSIS設置的圖像時,尺寸是SCD 1

+0

如果有人知道一個更好的方式來填充我的維度從臨時表基於業務密鑰和代理鍵,請讓我知道。 – exxoid

+0

任何人有任何建議嗎? – exxoid

回答

1

我會被分裂成這兩個操作啓動:生成代理鍵和填充維度表。第一步將是隻有3列的DISTINCT,第二步將變爲JOIN。索引兩個操作中使用的列可能會給你一些改進。

您可以組合DISTINCTNOT EXISTS以避免已經映射處理行,像這樣:

insert into dbo.KeyMappingTable (shipto, salpha, ssalpha) 
select distinct shipto, salpha, ssalpha 
from dbo.Source 
where not exists (
    select * 
    from dbo.KeyMappingTable 
    where shipto = dbo.Source.shipto and salpha = dbo.Source.salpha and ssalpha = dbo.Source.ssalpha 
) 

然後你的映射,所以你可以這樣做:

insert into dbo.DimShipTo (shipto_id, shipto /*, etc. */) 
select 
    m.shipto_id, 
    s.shipto -- etc. 
from 
    dbo.KeyMappingTable m 
    join dbo.Source s 
    on m.shipto = s.shipto and m.salpha = s.salpha and m.ssalpha = s.ssalpha 
where 
    not exists (
     select * 
     from dbo.DimShipTo 
     where shipto_id = m.shipto_id 
    ) 

您還應該查看MERGE,如果您使用Type 1維度並且只是想在更改地址或其他屬性(並且通常是有用的命令)時更新,那麼這很方便。但它只能從SQL Server 2008獲得;你沒有提到你正在使用的SQL Server的版本或版本。

+0

謝謝你的選擇,我會試試這個。 – exxoid